diff --git a/.ava.bench.config.js b/.ava.bench.config.js index 0562c394..28592830 100644 --- a/.ava.bench.config.js +++ b/.ava.bench.config.js @@ -1,4 +1,5 @@ export default { files: ['build/main/**/*.bench.js'], + workerThreads: false, verbose: true, }; diff --git a/.cspell.json b/.cspell.json index b9751906..2392cccc 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,12 +1,14 @@ { - "version": "0.1", + "version": "0.2", "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/master/cspell.schema.json", "language": "en", "words": [ + "ACTIVEBYTECODE", "ANYONECANPAY", "asmcrypto", "auditability", "auditable", + "bchn", "bchreg", "bchtest", "bcoin", @@ -19,11 +21,13 @@ "bitcore", "bitfield", "bitflags", + "bitjson", "BOOLAND", "BOOLOR", "bytecode", "camelcase", "cashaddr", + "CASHTOKENS", "CHECKDATASIG", "CHECKDATASIGVERIFY", "CHECKLOCKTIMEVERIFY", @@ -41,10 +45,12 @@ "combinators", "convertbits", "cyclomatic", + "Datacarrier", "deno", "deserialization", "deserialize", "devtools", + "Dreyzehner", "DYNAMICTOP", "ecdsa", "elliptic's", @@ -55,7 +61,12 @@ "FROMALTSTACK", "GREATERTHAN", "GREATERTHANOREQUAL", + "HMAC", "IFDUP", + "INPUTBYTECODE", + "INPUTINDEX", + "INPUTSEQUENCENUMBER", + "Ints", "INVALIDOPCODE", "LESSTHAN", "LESSTHANOREQUAL", @@ -71,16 +82,22 @@ "malleation", "malloc", "minification", + "MINIMALBOOL", "MINIMALIF", "monospace", "multisig", "nops", "NOTIF", + "nullary", "NULLDUMMY", "NULLFAIL", "NUMEQUAL", "NUMEQUALVERIFY", "NUMNOTEQUAL", + "OUTPOINTINDEX", + "OUTPOINTTXHASH", + "OUTPUTBYTECODE", + "OUTPUTVALUE", "parsimmon", "performant", "plusplus", @@ -98,12 +115,14 @@ "reversebytes", "ripemd", "RSHIFT", + "rustup", "satoshi", "satoshis", "schnorr", "seckey", "secp", "secp256k1", + "sigchecks", "sighash", "skippable", "SMALLINTEGER", @@ -118,12 +137,18 @@ "tpub", "tsdoc", "txid", + "TXINPUTCOUNT", + "TXLOCKTIME", + "TXOUTPUTCOUNT", + "TXVERSION", "typeof", "Uint", "uncompress", "unintuitive", "untrusted", "utxo", + "UTXOBYTECODE", + "UTXOVALUE", "VERIF", "VERNOTIF", "wasm", @@ -141,5 +166,6 @@ "tsconfig.json", "node_modules/**", "src/**/*.base64.ts" - ] + ], + "ignoreRegExpList": ["Base64", "HexValues"] } diff --git a/.eslintrc b/.eslintrc index 5e86e9b3..92ea1352 100644 --- a/.eslintrc +++ b/.eslintrc @@ -23,7 +23,9 @@ }, { "selector": "typeLike", "format": ["PascalCase"] }, { "selector": "enumMember", "format": ["camelCase", "UPPER_CASE"] } // Allow UPPER_CASE for opcodes - ] + ], + "import/no-internal-modules": ["error"], + "import/extensions": ["error", "always"] }, "overrides": [ /* @@ -44,7 +46,12 @@ } ] } - ] + ], + "functional/no-expression-statement": "off", + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-magic-numbers": "off", + "functional/immutable-data": "off", + "functional/no-return-void": "off" } } ] diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0af53ea6..8e458bc8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -6,7 +6,7 @@ Below you'll find the conventions we're trying to follow. Of course, please feel ## Design Goals -This library should provide the primitives needed to hack on Bitcoin and Bitcoin-related ideas. +This library should provide the primitives needed to hack on bitcoin and bitcoin-related ideas. 1. **flexible** - Consumers should be able to import only the functionality they need 2. **simple** - Functions should be simple and return one type @@ -19,7 +19,7 @@ This library should provide the primitives needed to hack on Bitcoin and Bitcoin - **trust the caller** - Runtime type-checking is a code smell. If the function accepts a string, assume it's been given a string. TypeScript definitions should expose improperly called functions to the developer at compile time, don't re-implement it at runtime. (Where TypeScript's lack of dependent types prevents us from checking the validity of an input at compile time, resist the urge to check it at runtime. Trust that the caller can test their code themselves.) - **simple > ergonomic** - Clever, javascript-y interfaces are fun until they're limiting. We export simple primitives; other projects can wrap this library to provide friendlier interfaces. - **clarity > performance** - Performance is a secondary goal. If our consumers need to squeeze out performance from a single machine, they should switch to something lower-level. The best way to speed up a consumer of this library is to parallelize it across more hardware. -- **don't overvalue historical names** - Many Bitcoin implementations make imprecise (and even misleading) naming choices for historical reasons. We make little effort to match the type/function names of other Bitcoin implementations; names should be chosen to improve clarity. +- **don't overvalue historical names** - Many bitcoin implementations make imprecise (and even misleading) naming choices for historical reasons. We make little effort to match the type/function names of other bitcoin implementations; names should be chosen to improve clarity. - **don't add package dependencies** - This library should be as simple and stable as possible. Generally, if something is hard enough to warrant bringing in a dependency, it's something this library should provide. (Can you compile and expose a WASM version?) ## Some Practical Details @@ -27,28 +27,6 @@ This library should provide the primitives needed to hack on Bitcoin and Bitcoin - **accept `readonly`, return mutable** - We should always return mutable types to allow consumers the option of mutating results without running afoul of type-checking. For the same reason, when we accept a value, we should always accept it as `readonly` for maximum flexibility. - **use `eslint-disable-next-line` or `eslint-disable-line`** - It's ok to disable eslint; in some cases, rules should be disabled every time they're hit (e.g. `no-bitwise`). By using single-line disables, we clearly mark intentional deviations from our conventions. - **avoid Hungarian notation & name prefixing** – Including the type of a variable in its name is a code smell: a name should clearly describe only one concept, and types are the business of the type system. Likewise, using prefixes to distinguish between an interface and an instance typically indicates the concepts should be simplified. E.g. `IChecker` and `Checker` – this is likely made unnecessarily complex to accommodate an object-oriented style. Consider replacing with a single function (or if instantiation is required, an object containing only stateless functions). -- **don't throw things** – instead, return a result which can be either successful or an error. This strategy encourages a more functional approach to problems, and pragmatically, [TypeScript does not yet offer a `throws` clause or otherwise](https://github.com/microsoft/TypeScript/issues/13219), so only this strategy allows errors to be well-typed. A good pattern is `() => string | ResultType`, where ResultType is the desired output, and error messages are returned as a string. Consumers can easily use `typeof result === 'string'` to narrow the resulting type. When errors are more complex or `ResultType` is also a string, use an object with a `success` property, e.g. `() => { success: true, bytecode: Uint8Array } | { success: false, errors: ErrorType[] }`. +- **don't throw things** – instead, return a result that can be either a success or error type. This strategy encourages a more functional approach to problems, and pragmatically, [TypeScript does not yet offer a `throws` clause or otherwise](https://github.com/microsoft/TypeScript/issues/13219), so only this strategy allows errors to be well-typed. A good pattern is `() => string | ResultType`, where ResultType is the desired output, and error messages are returned as a string. Consumers can easily use `typeof result === 'string'` to narrow the resulting type. When errors are more complex or `ResultType` is also a string, use an object with a `success` property, e.g. `() => { success: true, bytecode: Uint8Array } | { success: false, errors: ErrorType[] }`. - **test the import** – when importing modules within the library, aim to import from a sibling or a sibling of the closest mutual parent module (this helps to avoid import cycles), rather than importing from a higher-level export (like `lib.ts`). When importing modules within test files, always import directly from the top-level `lib.ts` file – this ensures that intended public functionality is available and working as expected. (Note: this is also enforced by our eslint configuration.) - **try the formatting utilities** – especially when writing tests for large, complex objects, the `stringify` and `stringifyTestVector` utilities can save you a lot of time. - -## Areas for Improvement - -### Thinner WASM Implementations/Imports - -One area where we could improve in terms of the [`flexibility` Design Goal](../README.md#Design-Goals) (`Consumers should be able to import only the functionality they need`) is with WASM implementations. - -While WASM can't currently be tree-shaken (in [the "live code inclusion" sense](https://medium.com/@Rich_Harris/tree-shaking-versus-dead-code-elimination-d3765df85c80)), we might be able to provide thinned-down versions of different WASM modules for use-cases which don't require the full module. - -Our method for instantiating and wrapping the WASM module also prevents tree-shaking of unused wrapper code. (And breaks slightly from a purely-functional programming style.) - -It may be better to instead provide each wrapper method as an individually exported function (which accepts a WASM object of the proper shape, as well as the parameters it currently accepts). E.g. rather than creating an object full of methods like: - -``` -wasm.method(param, param) -``` - -We would use pure-looking methods which accept the WASM object (fundamentally, you can't get much purer when using WASM): - -``` -methodWasm(wasm, param, param) -``` diff --git a/.gitignore b/.gitignore index ad77fde6..891db78d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ coverage *.log report.*.json scratch +gitignore.* src/lib/bin/**/*.html src/lib/bin/**/*.js diff --git a/.vscode/launch.json b/.vscode/launch.json index 708ac0f6..eb04bc6b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,12 +7,10 @@ "request": "launch", "name": "Debug Active Spec", "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/ava", - "runtimeArgs": ["debug", "--break", "--serial", "${file}"], - "port": 9229, + "runtimeArgs": ["--serial", "${file}"], "outputCapture": "std", - "skipFiles": ["/**/*.js"], + "skipFiles": ["/**", "**/node_modules/**"], "preLaunchTask": "npm: build" - // "smartStep": true }, { // Use this one if you're already running `yarn watch` @@ -20,11 +18,9 @@ "request": "launch", "name": "Debug Active Spec (no build)", "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/ava", - "runtimeArgs": ["debug", "--break", "--serial", "${file}"], - "port": 9229, + "runtimeArgs": ["--serial", "${file}"], "outputCapture": "std", - "skipFiles": ["/**/*.js"] - // "smartStep": true + "skipFiles": ["/**", "**/node_modules/**"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index d4002c04..f5025c53 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,6 @@ "editor.semanticHighlighting.enabled": true, "typescript.tsdk": "node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, - "cSpell.enabled": true + "cSpell.enabled": true, + "typescript.preferences.importModuleSpecifierEnding": "js" } diff --git a/LICENSE b/LICENSE index e783b9b4..8e4e0fa5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Jason Dreyzehner +Copyright (c) Jason Dreyzehner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9cdceb3a..7d0bbeb0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

- An ultra-lightweight JavaScript library for Bitcoin, Bitcoin Cash, and Bitauth + An ultra-lightweight JavaScript library for Bitcoin Cash, Bitcoin, and Bitauth applications.

@@ -49,7 +49,7 @@ Libauth has **no dependencies** and works in all JavaScript environments, includ Libauth is designed to be **flexible**, **lightweight**, and **easily auditable**. Rather than providing a single, overarching, object-oriented API, all functionality is composed from simple functions. This has several benefits: - **Flexibility** – Even highly-complex functionality is built-up from simpler functions. These lower-level functions can be used to experiment, tweak, and remix your own higher-level methods without maintaining a fork of the library. -- **Smaller application bundles** – Applications can import only the methods they need, eliminating the unused code (via [dead-code elimination](https://webpack.js.org/guides/tree-shaking/)). +- **Smaller application bundles** – Applications can import only the methods they need, eliminating the unused code (via [dead-code elimination](https://rollupjs.org/guide/en/#tree-shaking)). - **Better auditability** – Beyond having no dependencies of its own, Libauth's [functional programming](https://en.wikipedia.org/wiki/Functional_programming) approach makes auditing critical code easier: smaller bundles, smaller functions, and less churn between versions (fewer cascading changes to object-oriented interfaces). - **Fully-portable** – No platform-specific APIs are ever used, so the same code paths are used across all JavaScript environments (reducing the auditable "surface area" and simplifying library development). @@ -66,31 +66,36 @@ yarn add @bitauth/libauth And import the functionality you need: ```typescript -import { instantiateSecp256k1 } from '@bitauth/libauth'; +import { secp256k1 } from '@bitauth/libauth'; import { msgHash, pubkey, sig } from './somewhere'; -(async () => { - const secp256k1 = await instantiateSecp256k1(); - secp256k1.verifySignatureDERLowS(sig, pubkey, msgHash) - ? console.log('🚀 Signature valid') - : console.log('❌ Signature invalid'); -})(); +secp256k1.verifySignatureDERLowS(sig, pubkey, msgHash) + ? console.log('🚀 Signature valid') + : console.log('❌ Signature invalid'); ``` -### Typescript Types +Note, Libauth is a [pure ESM package](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c), so Node.js v12 or higher is required (or Deno), and [using ESM is recommended](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c#how-can-i-move-my-commonjs-project-to-esm). + +### Web Usage + +For web projects, a bundler with [dead-code elimination](https://rollupjs.org/guide/en/#tree-shaking) (A.K.A. "tree shaking") is **strongly recommended** – Libauth is designed to minimize application code size, and dead-code elimination will improve load performance in nearly all applications. -**Note**: `@bitauth/libauth` uses [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt), [`WebAssembly`](https://developer.mozilla.org/en-US/docs/WebAssembly), and `es2017` features for some functionality. While support is required to use this functionality (Node.js v10 LTS or later), other parts of the library will continue to work in older environments. To include the necessary TypeScript library files in you application, add `"lib": ["es2017", "esnext.bigint", "dom"]` to your `tsconfig.json`. +Consider [Parcel](https://parceljs.org/), [Rollup](https://rollupjs.org/), [Webpack](https://webpack.js.org/), or a bundler designed for your web framework. -### Using with Deno +### Deno Usage -Deno is a great runtime for quickly working with Libauth. You can import from the latest module build: +Deno is a great runtime for working with Libauth. You can import the library from `unpkg.com`: ```ts -import { hexToBin } from 'https://unpkg.com/@bitauth/libauth/build/module/index.js'; +import { hexToBin } from 'https://unpkg.com/@bitauth/libauth/build/index.js'; console.log(hexToBin('beef')); ``` +### Typescript Types + +Libauth uses [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt), [`WebAssembly`](https://developer.mozilla.org/en-US/docs/WebAssembly), and `es2017` features for some functionality. To type-check this library in you application (without [`skipLibCheck`](https://www.typescriptlang.org/tsconfig#skipLibCheck)), your `tsconfig.json` will need a minimum `target` of `es2020` or `lib` must include `es2017` and `esnext.bigint`. If your application is not already importing types for `WebAssembly`, you may also need to add `dom` to `lib`. + ## Stable API The following APIs are considered stable, and will only include breaking changes in major version upgrades. @@ -124,7 +129,7 @@ Libauth also exports new, potentially unstable APIs. As these APIs stabilize, th Pull Requests welcome! Please see [`CONTRIBUTING.md`](.github/CONTRIBUTING.md) for details. -This library requires [Yarn](https://yarnpkg.com/) for development. If you don't have Yarn, make sure you have `Node.js` installed (which ships with `npm`), then run `npm install -g yarn`. Once Yarn is installed: +This library requires [Yarn](https://yarnpkg.com/) for development. If you don't have Yarn, make sure you have `Node.js` installed (ships with `npm`), then run `npm install -g yarn`. Once Yarn is installed: ```sh # use --recursive to clone the secp256k1 submodule diff --git a/SECURITY.md b/SECURITY.md index b22b8b5f..8456f866 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,9 +4,9 @@ Thank you for your interest in Libauth's security! ## Supported Versions -Only the latest major version (currently `1.*`) is regularly supported. +Only the latest major version is regularly supported. -Critical security issues may be backported to previous versions, but we recommend all users migrate to new major versions within 6 months of release. +Critical security updates may be backported to previous versions, but we recommend all users migrate to new major versions within 6 months of release. ## Reporting a Vulnerability diff --git a/config/tsconfig.module.json b/config/tsconfig.module.json deleted file mode 100644 index 4f96b5e2..00000000 --- a/config/tsconfig.module.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig", - "compilerOptions": { - "target": "es2019", - "outDir": "../build/module", - "module": "esnext" - }, - "exclude": ["node_modules/**"] -} diff --git a/package.json b/package.json index 62c01c2b..17c31bc4 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "@bitauth/libauth", - "version": "1.19.0", - "description": "ultra-lightweight library for Bitcoin, Bitcoin Cash, and Bitauth", - "main": "build/main/index.js", - "typings": "build/module/index.d.ts", - "module": "build/module/index.js", + "version": "1.19.1", + "description": "ultra-lightweight library for Bitcoin Cash, Bitcoin, and Bitauth", + "type": "module", + "exports": "./build/index.js", + "types": "./build/index.d.ts", "repository": "https://github.com/bitauth/libauth", "homepage": "https://libauth.org/", "license": "MIT", @@ -33,34 +33,42 @@ "info": "npm-scripts-info", "compile:secp256k1": "docker build -f wasm/docker/secp256k1.Dockerfile . -t libauth-secp256k1 && docker run -it --mount type=bind,src=$(pwd)/src/lib,dst=/libauth/out,consistency=delegated libauth-secp256k1", "compile:hashes": "docker build -f wasm/docker/hashes.Dockerfile . -t libauth-hashes && docker run -it --mount type=bind,src=$(pwd)/src/lib,dst=/libauth/out,consistency=delegated libauth-hashes", - "build": "run-s clean && run-p build:*", - "build:main": "tsc -p tsconfig.json", - "build:module": "tsc -p config/tsconfig.module.json", + "build": "run-p build:*", + "build:tsc": "tsc -p tsconfig.json", "build:wasm": "run-p copy:wasm:secp256k1 copy:wasm:sha1 copy:wasm:sha256 copy:wasm:sha512 copy:wasm:ripemd160", - "copy:wasm:secp256k1": "cpy src/lib/bin/secp256k1/secp256k1.wasm build/main/lib/bin/secp256k1 && cpy src/lib/bin/secp256k1/secp256k1.wasm build/module/lib/bin/secp256k1", - "copy:wasm:sha1": "cpy src/lib/bin/sha1/sha1.wasm build/main/lib/bin/sha1 && cpy src/lib/bin/sha1/sha1.wasm build/module/lib/bin/sha1", - "copy:wasm:sha256": "cpy src/lib/bin/sha256/sha256.wasm build/main/lib/bin/sha256 && cpy src/lib/bin/sha256/sha256.wasm build/module/lib/bin/sha256", - "copy:wasm:sha512": "cpy src/lib/bin/sha512/sha512.wasm build/main/lib/bin/sha512 && cpy src/lib/bin/sha512/sha512.wasm build/module/lib/bin/sha512", - "copy:wasm:ripemd160": "cpy src/lib/bin/ripemd160/ripemd160.wasm build/main/lib/bin/ripemd160 && cpy src/lib/bin/ripemd160/ripemd160.wasm build/module/lib/bin/ripemd160", + "copy:wasm:secp256k1": "cpy --flat src/lib/bin/secp256k1/secp256k1.wasm build/lib/bin/secp256k1", + "copy:wasm:sha1": "cpy --flat src/lib/bin/sha1/sha1.wasm build/lib/bin/sha1", + "copy:wasm:sha256": "cpy --flat src/lib/bin/sha256/sha256.wasm build/lib/bin/sha256", + "copy:wasm:sha512": "cpy --flat src/lib/bin/sha512/sha512.wasm build/lib/bin/sha512", + "copy:wasm:ripemd160": "cpy --flat src/lib/bin/ripemd160/ripemd160.wasm build/lib/bin/ripemd160", "compile:debug:secp256k1": "docker run -it libauth-secp256k1 bash", "compile:debug:hashes": "docker run -it libauth-hashes bash", "fix": "run-s fix:*", "fix:prettier": "prettier \"src/**/*.ts\" --write", "fix:lint": "eslint . --ext .ts --fix", + "gen:vmb-tests": "run-s build gen:vmb-tests:*", + "gen:vmb-tests:bch": "node 'build/lib/vmb-tests/bch-vmb-tests.spec.helper.js' 'src/lib/vmb-tests/generated/bch' && prettier 'src/lib/vmb-tests/generated/bch/*.json' --write", + "gen:schema": "run-p gen:schema:*", + "gen:schema:authentication-template": "ts-json-schema-generator --no-ref-encode --path 'src/lib/compiler/template-types.ts' --type 'AuthenticationTemplate' > src/lib/schema/authentication-template.schema.json && prettier 'src/lib/schema/authentication-template.schema.json' --write && ajv compile -s src/lib/schema/authentication-template.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-authentication-template.js && prettier 'src/lib/schema/ajv/validate-authentication-template.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-authentication-template.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", + "gen:schema-TODO": "//TODO: use ajv compile --code-esm option after merge: https://github.com/ajv-validator/ajv-cli/pull/200", + "gen:templates": "run-s build && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels' > src/lib/transaction/fixtures/templates/cash-channels.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", "test": "run-s build test:*", "test:deps": "node -e \"if(Object.keys(require('./package.json').dependencies).length > 0) { console.error('Dependencies are not allowed.'); process.exit(1); }\"", + "test:schemas": "run-s gen:schema && if [ `git status src/lib/schema --porcelain | head -c1 | wc -c` -gt 0 ]; then echo \"Error: one or more schemas are outdated. Please review and commit the changes in src/lib/schema.\" && false; fi && echo \"Schemas are up to date.\"", "test:lint": "eslint . --ext .ts", "test:prettier": "prettier \"src/**/*.ts\" --list-different", "test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"", - "test:unit": "nyc --silent ava", + "test:cycles": "madge --circular build/index.js", + "test:unit": "NODE_OPTIONS=--openssl-legacy-provider nyc --silent ava", "test:unit:fast": "nyc --silent ava --match='!*[fast-check]*' --match='!*[crypto]*' --match='!*[script_tests]*' --match='!*[signing-serialization tests]*' --match='!*[BCH compiler]*' --match='!*[BCH VM]*'", "test:unit:fast-check": "nyc --silent ava --match='*[fast-check]*", - "test:unit:script_tests": "nyc --silent ava --match='*[script_tests]*' --verbose --serial", + "test:unit:script_tests": "nyc --silent ava --match='*[script_tests]*' --serial", + "test:unit:vmb_tests": "nyc --silent ava src/lib/vmb-tests/bch-vmb-tests.spec.ts --serial", + "test:unit:vmb_test": "node 'build/lib/vmb-tests/bch-vmb-test.spec.helper.js'", "bench": "run-s build bench:browser-deps bench:test", - "bench:test": "ava --config .ava.bench.config.js --serial --timeout=2m", + "bench:test": "NODE_OPTIONS=--openssl-legacy-provider ava --config .ava.bench.config.js --serial --timeout=2m", "bench:browser-deps": "browserify node_modules/chuhai/index.js --standalone chuhai -o build/bench/chuhai.js && browserify node_modules/hash.js/lib/hash.js --standalone hash -o build/bench/hash.js", - "watch": "run-s clean build:main build:wasm && yarn build:main -- -w", - "watch:module": "run-s clean build:main build:wasm && yarn build:module -- -w", + "watch": "run-s build:tsc build:wasm && yarn build:tsc -- -w", "watch:single": "echo 'Usage: yarn watch:single --match=\"*pattern*\"' && ava -v --watch", "watch:test": "yarn test:unit:fast -- --watch -v", "watch:test-slow": "yarn test:unit -- --watch -v", @@ -79,90 +87,71 @@ "doc:generate": "api-documenter markdown -i temp -o docs/markdown", "doc:check-api": "api-extractor run --typescript-compiler-folder node_modules/typescript", "doc:publish": "gh-pages -m \"[ci skip] Updates\" -d build/docs", - "doc:generate-json-schema": "ts-json-schema-generator --path 'src/lib/template/template-types.ts' --type 'AuthenticationTemplate' > src/lib/template/bitauth-authentication-template.schema.json", - "doc:generate-templates": "node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' '1-of-8-tree' > src/lib/transaction/fixtures/templates/1-of-8-tree.json && node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/main/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels' > src/lib/transaction/fixtures/templates/cash-channels.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", "version": "standard-version", "reset": "git clean -dfx && git reset --hard && yarn", - "clean": "trash build test", "prepare-release": "run-s reset test cov:check doc:html doc:logo doc:cname version doc:publish" }, - "scripts-info": { - "info": "Display information about the package scripts", - "build": "Clean and rebuild the project", - "fix": "Try to automatically fix any linting problems", - "test": "Lint and unit test the project", - "bench": "Build the project and run the benchmarks", - "watch": "Watch and rebuild the project on save, then rerun relevant tests", - "watch:with-crypto": "Like 'watch', but also including tests for the crypto APIs", - "cov": "Rebuild, run tests, then create and open the coverage report", - "doc": "Generate HTML API documentation and open it in a browser", - "doc:json": "Generate API documentation in typedoc JSON format", - "compile": "Compile the WebAssembly binaries and integrate them into src", - "compile:debug:secp256k1": "Run the compile:secp256k1 Docker container in interactive mode", - "compile:inspect:secp256k1": "Format the compile:secp256k1 output for easier review", - "version": "Bump package.json version, update CHANGELOG.md, tag release", - "reset": "Delete all untracked files and reset the repo to the last commit", - "prepare-release": "One-step: clean, build, test, publish docs, and prep a release" - }, "engines": { - "node": ">=8.9" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "dependencies": {}, "devDependencies": { - "@ava/typescript": "^1.1.1", + "@ava/typescript": "^3.0.1", "@bitjson/npm-scripts-info": "^1.0.0", - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@microsoft/api-documenter": "^7.8.22", - "@microsoft/api-extractor": "^7.9.3", - "@rollup/plugin-alias": "^3.1.1", - "@rollup/plugin-commonjs": "^14.0.0", - "@rollup/plugin-node-resolve": "^8.4.0", - "@types/browserify": "^12.0.33", - "@types/elliptic": "^6.4.12", - "@types/express": "^4.17.7", - "@types/puppeteer": "^3.0.1", - "@typescript-eslint/parser": "^3.8.0", + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@microsoft/api-documenter": "^7.17.13", + "@microsoft/api-extractor": "^7.23.2", + "@rollup/plugin-alias": "^3.1.9", + "@rollup/plugin-commonjs": "^22.0.0", + "@rollup/plugin-node-resolve": "^13.3.0", + "@types/browserify": "^12.0.37", + "@types/elliptic": "^6.4.14", + "@types/express": "^4.17.13", + "@types/puppeteer": "^5.4.6", + "@typescript-eslint/eslint-plugin": "^5.23.0", + "@typescript-eslint/parser": "^5.23.0", + "ajv-cli": "^5.0.0", "asmcrypto.js": "^2.3.2", - "ava": "^3.11.1", - "ava-fast-check": "^2.0.0", - "bcrypto": "^5.2.0", - "bitcore-lib-cash": "^8.22.0", - "browserify": "16.5.1", + "ava": "^4.1.0", + "ava-fast-check": "^5.0.0", + "bcrypto": "^5.4.0", + "bitcore-lib-cash": "^8.25.28", + "browserify": "17.0.0", "chuhai": "^1.2.0", - "codecov": "^3.7.2", - "cpy-cli": "^3.1.1", - "cspell": "^4.0.63", - "cz-conventional-changelog": "^3.2.0", - "elliptic": "^6.5.3", - "eslint": "^7.6.0", - "eslint-config-bitauth": "^2.0.0", - "eslint-config-prettier": "^6.11.0", + "codecov": "^3.8.3", + "cpy-cli": "^4.1.0", + "cspell": "^5.20.0", + "cz-conventional-changelog": "^3.3.0", + "elliptic": "^6.5.4", + "eslint": "8.15.0", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-functional": "^3.0.1", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-tsdoc": "^0.2.6", - "express": "^4.17.1", - "fast-check": "^2.1.0", - "gh-pages": "^3.1.0", + "eslint-plugin-functional": "^4.2.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-tsdoc": "^0.2.14", + "express": "^4.18.1", + "fast-check": "^2.25.0", + "gh-pages": "^4.0.0", "hash.js": "^1.1.5", + "madge": "^5.0.1", "npm-run-all": "^4.1.5", "nyc": "^15.1.0", - "open-cli": "^6.0.1", - "prettier": "^2.0.5", - "puppeteer": "^5.2.1", - "rollup": "^2.23.1", - "secp256k1": "^4.0.2", - "source-map-support": "^0.5.19", - "standard-version": "^8.0.2", - "trash-cli": "^3.1.0", - "ts-json-schema-generator": "^0.70.2", - "ts-node": "^8.10.2", - "typedoc": "^0.17.8", - "typescript": "^3.9.7" + "open-cli": "^7.0.1", + "prettier": "^2.6.2", + "puppeteer": "^14.1.0", + "rollup": "^2.73.0", + "secp256k1": "^4.0.3", + "source-map-support": "^0.5.21", + "standard-version": "^9.3.2", + "trash-cli": "^5.0.0", + "ts-json-schema-generator": "^1.0.0", + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.4" }, "files": [ - "build/main", - "build/module", + "build", "!**/*.spec.*", "!**/*.json", "CHANGELOG.md", @@ -174,13 +163,15 @@ "failFast": true, "timeout": "20s", "typescript": { + "compile": false, "rewritePaths": { - "src/": "build/main/" + "src/": "build/" } }, - "files": [ - "!build/module/**" - ] + "nodeArguments": [ + "--experimental-json-modules" + ], + "workerThreads": false }, "config": { "commitizen": { @@ -193,7 +184,26 @@ ] }, "prettier": { - "singleQuote": true + "singleQuote": true, + "overrides": [ + { + "files": [ + "src/lib/vmb-tests/bch-vmb-tests.ts", + "src/lib/schema/generated/*.js" + ], + "options": { + "printWidth": 400 + } + }, + { + "files": [ + "src/lib/vmb-tests/generated/bch/*.json" + ], + "options": { + "printWidth": 10000 + } + } + ] }, "nyc": { "extends": "@istanbuljs/nyc-config-typescript", diff --git a/src/index.ts b/src/index.ts index 1014a204..8b5359f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -export * from './lib/lib'; +export * from './lib/lib.js'; diff --git a/src/lib/address/address.ts b/src/lib/address/address.ts index abd617fc..5caf6a0f 100644 --- a/src/lib/address/address.ts +++ b/src/lib/address/address.ts @@ -1,4 +1,4 @@ -export * from './base58-address'; -export * from './bech32'; -export * from './cash-address'; -export * from './locking-bytecode'; +export * from './base58-address.js'; +export * from './bech32.js'; +export * from './cash-address.js'; +export * from './locking-bytecode.js'; diff --git a/src/lib/address/base58-address.spec.ts b/src/lib/address/base58-address.spec.ts index ed433663..dd222578 100644 --- a/src/lib/address/base58-address.spec.ts +++ b/src/lib/address/base58-address.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; @@ -11,14 +10,14 @@ import { encodeBase58Address, encodeBase58AddressFormat, hexToBin, - instantiateSha256, lockingBytecodeToBase58Address, -} from '../lib'; + sha256, +} from '../lib.js'; -import * as keyIoInvalid from './fixtures/key_io_invalid.json'; -import * as keyIoValid from './fixtures/key_io_valid.json'; - -const sha256Promise = instantiateSha256(); +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import keyIoInvalid from './fixtures/key_io_invalid.json' assert { type: 'json' }; +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import keyIoValid from './fixtures/key_io_valid.json' assert { type: 'json' }; const invalidVectors = Object.values(keyIoInvalid).filter( (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') @@ -28,78 +27,83 @@ const validVectors = Object.values(keyIoValid).filter((item) => item.every((x) => !Array.isArray(x)) ); -test('encodeBase58AddressFormat', async (t) => { - const sha256 = await sha256Promise; +test('encodeBase58AddressFormat', (t) => { const payload = hexToBin('65a16059864a2fdbc7c99a4723a8395bc6f188eb'); + t.deepEqual( + encodeBase58AddressFormat(Base58AddressFormatVersion.p2pkh, payload), + // cspell: disable-next-line + '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' + ); t.deepEqual( encodeBase58AddressFormat( - sha256, Base58AddressFormatVersion.p2pkh, - payload + payload, + sha256 ), // cspell: disable-next-line '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' ); }); -test('encodeBase58Address', async (t) => { - const sha256 = await sha256Promise; +test('encodeBase58Address', (t) => { const payload = hexToBin('76a04053bda0a88bda5177b86a15c3b29f559873'); t.deepEqual( - encodeBase58Address(sha256, 'p2pkh', payload), + encodeBase58Address('p2pkh', payload, sha256), // cspell: disable-next-line '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu' ); t.deepEqual( - encodeBase58Address(sha256, 'p2pkh-testnet', payload), + encodeBase58Address('p2pkhTestnet', payload, sha256), // cspell: disable-next-line 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx' ); t.deepEqual( - encodeBase58Address(sha256, 'p2pkh-copay-bch', payload), + encodeBase58Address('p2pkhCopayBCH', payload), // cspell: disable-next-line 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp' ); t.deepEqual( - encodeBase58Address(sha256, 'p2sh', payload), + encodeBase58Address('p2sh20', payload, sha256), // cspell: disable-next-line '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC' ); t.deepEqual( - encodeBase58Address(sha256, 'p2sh-testnet', payload), + encodeBase58Address('p2sh20Testnet', payload), // cspell: disable-next-line '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W' ); t.deepEqual( - encodeBase58Address(sha256, 'p2sh-copay-bch', payload), + encodeBase58Address('p2sh20CopayBCH', payload, sha256), // cspell: disable-next-line 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT' ); }); -test('decodeBase58AddressFormat', async (t) => { - const sha256 = await sha256Promise; +test('decodeBase58AddressFormat', (t) => { const payload = hexToBin('65a16059864a2fdbc7c99a4723a8395bc6f188eb'); t.deepEqual( // cspell: disable-next-line - decodeBase58AddressFormat(sha256, '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { - payload, - version: Base58AddressFormatVersion.p2pkh, - } + decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), + { payload, version: Base58AddressFormatVersion.p2pkh } + ); + t.deepEqual( + // cspell: disable-next-line + decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), + { payload, version: Base58AddressFormatVersion.p2pkh } ); }); -test('decodeBase58Address', async (t) => { - const sha256 = await sha256Promise; +test('decodeBase58Address', (t) => { const payload = hexToBin('65a16059864a2fdbc7c99a4723a8395bc6f188eb'); t.deepEqual( // cspell: disable-next-line - decodeBase58Address(sha256, '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { - payload, - version: Base58AddressFormatVersion.p2pkh, - } + decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), + { payload, version: Base58AddressFormatVersion.p2pkh } + ); + t.deepEqual( + // cspell: disable-next-line + decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), + { payload, version: Base58AddressFormatVersion.p2pkh } ); }); @@ -112,12 +116,10 @@ const maxBinLength = 100; testProp( '[fast-check] encodeBase58Address <-> decodeBase58Address', - [fc.integer(0, maxUint8Number), fcUint8Array(0, maxBinLength)], - async (t, version: number, payload: Uint8Array) => { - const sha256 = await sha256Promise; - const address = encodeBase58AddressFormat(sha256, version, payload); - - const decoded = decodeBase58AddressFormat(sha256, address); + [fc.integer({ max: maxUint8Number, min: 0 }), fcUint8Array(0, maxBinLength)], + (t, version: number, payload: Uint8Array) => { + const address = encodeBase58AddressFormat(version, payload); + const decoded = decodeBase58AddressFormat(address); if (typeof decoded === 'string') { t.fail(decoded); return; @@ -129,42 +131,37 @@ testProp( } ); -test('decodeBase58AddressFormat: errors', async (t) => { - const sha256 = await sha256Promise; +test('decodeBase58AddressFormat: errors', (t) => { t.deepEqual( // cspell: disable-next-line - decodeBase58AddressFormat(sha256, '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62a'), + decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62a'), Base58AddressError.invalidChecksum ); - t.deepEqual( - decodeBase58AddressFormat(sha256, '1234'), - Base58AddressError.tooShort - ); + t.deepEqual(decodeBase58AddressFormat('1234'), Base58AddressError.tooShort); t.deepEqual( // cspell: disable-next-line - decodeBase58AddressFormat(sha256, '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I'), + decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I'), Base58AddressError.unknownCharacter ); }); -test('decodeBase58Address: errors', async (t) => { - const sha256 = await sha256Promise; +test('decodeBase58Address: errors', (t) => { t.deepEqual( // cspell: disable-next-line - decodeBase58Address(sha256, '6PfDNQxJdsBx7K4r9kMrRBZSa2NZKVNUZn'), + decodeBase58Address('6PfDNQxJdsBx7K4r9kMrRBZSa2NZKVNUZn'), Base58AddressError.unknownAddressVersion ); t.deepEqual( // cspell: disable-next-line - decodeBase58Address(sha256, '2DqXtydYdu9pq6uXcy3Tbw3pUscCiPC6F'), + decodeBase58Address('2DqXtydYdu9pq6uXcy3Tbw3pUscCiPC6F'), // Base58AddressError.incorrectLength Base58AddressError.unknownAddressVersion ); }); -test('Base58Address Invalid Vectors', async (t) => { - const sha256 = await sha256Promise; +test('Base58Address Invalid Vectors', (t) => { invalidVectors.forEach(([invalid]) => { - const result = decodeBase58Address(sha256, invalid); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const result = decodeBase58Address(invalid!); const hasError = typeof result === 'string'; if (!hasError) { /* @@ -173,7 +170,7 @@ test('Base58Address Invalid Vectors', async (t) => { */ t.deepEqual(result, { payload: hexToBin('bc6437e3089918c9cb7e3d3ddd7ca83969b1e0bc'), - version: Base58AddressFormatVersion.p2shCopayBCH, + version: Base58AddressFormatVersion.p2sh20CopayBCH, }); return; } @@ -181,8 +178,7 @@ test('Base58Address Invalid Vectors', async (t) => { }); }); -test('Base58Address Valid Vectors (from C++ implementation – includes WIF vectors)', async (t) => { - const sha256 = await sha256Promise; +test('Base58Address Valid Vectors (from C++ implementation – includes WIF vectors)', (t) => { // eslint-disable-next-line complexity validVectors.forEach((vectors) => { const [base58Address, data, meta] = vectors as [ @@ -191,7 +187,7 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect { isCompressed?: boolean; isPrivkey: boolean; - chain: 'main' | 'test' | 'regtest'; + chain: 'main' | 'regtest' | 'test'; } ]; @@ -204,25 +200,23 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect const type = testnet ? compressed ? 'testnet' - : 'testnet-uncompressed' + : 'testnetUncompressed' : compressed ? 'mainnet' - : 'mainnet-uncompressed'; - t.deepEqual(decodePrivateKeyWif(sha256, wifKey), { privateKey, type }); + : 'mainnetUncompressed'; + t.deepEqual(decodePrivateKeyWif(wifKey), { privateKey, type }); // eslint-disable-next-line functional/no-conditional-statement } else { const lockingBytecode = data; t.deepEqual( lockingBytecodeToBase58Address( - sha256, hexToBin(lockingBytecode), - testnet ? 'testnet' : 'mainnet' + testnet ? 'testnet' : 'mainnet', + sha256 ), base58Address ); } - - // t.deepEqual(typeof decodeBase58Address(sha256, invalid), 'string'); }); }); diff --git a/src/lib/address/base58-address.ts b/src/lib/address/base58-address.ts index b450ea0c..622195e6 100644 --- a/src/lib/address/base58-address.ts +++ b/src/lib/address/base58-address.ts @@ -1,10 +1,11 @@ -import { Sha256 } from '../crypto/crypto'; +import { sha256 as internalSha256 } from '../crypto/default-crypto-instances.js'; import { base58ToBin, BaseConversionError, binToBase58, flattenBinArray, -} from '../format/format'; +} from '../format/format.js'; +import type { Sha256 } from '../lib'; /** * Base58 version byte values for common Base58Address format versions. @@ -17,11 +18,12 @@ export enum Base58AddressFormatVersion { */ p2pkh = 0, /** - * A Pay to Script Hash (P2SH) address – base58 encodes to a leading `3`. + * A 20-byte Pay to Script Hash (P2SH20) address – base58 encodes to a leading + * `3`. * * Hex: `0x05` */ - p2sh = 5, + p2sh20 = 5, /** * A private key in Wallet Import Format. For private keys used with * uncompressed public keys, the payload is 32 bytes and causes the version @@ -40,12 +42,12 @@ export enum Base58AddressFormatVersion { */ p2pkhTestnet = 111, /** - * A testnet Pay to Script Hash (P2SH) address – base58 encodes to a leading - * `2`. + * A testnet 20-byte Pay to Script Hash (P2SH20) address – base58 encodes to a + * leading `2`. * * Hex: `0xc4` */ - p2shTestnet = 196, + p2sh20Testnet = 196, /** * A private key in Wallet Import Format intended for testnet use. For private * keys used with uncompressed public keys, the payload is 32 bytes and causes @@ -66,20 +68,20 @@ export enum Base58AddressFormatVersion { */ p2pkhCopayBCH = 28, /** - * A Pay to Script Hash (P2SH) address intended for use on the Bitcoin - * Cash network – base58 encodes to a leading `H`. This version was + * A 20-byte Pay to Script Hash (P2SH20) address intended for use on the + * Bitcoin Cash network – base58 encodes to a leading `H`. This version was * temporarily used by the Copay project before the CashAddress format was * standardized. * * Hex: `0x28` */ - p2shCopayBCH = 40, + p2sh20CopayBCH = 40, } /** * The available networks for common Base58Address versions. */ -export type Base58AddressNetwork = 'mainnet' | 'testnet' | 'copay-bch'; +export type Base58AddressNetwork = 'copayBCH' | 'mainnet' | 'testnet'; /** * Encode a payload using the Base58Address format, the original address format @@ -98,17 +100,18 @@ export type Base58AddressNetwork = 'mainnet' | 'testnet' | 'copay-bch'; * The checksum is the first 4 bytes of the double-SHA256 hash of the version * byte followed by the payload. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) - * @param version - the address version byte (see `Base58Version`) + * @param version - the address version byte (see + * {@link Base58AddressFormatVersion}) * @param payload - the Uint8Array payload to encode + * @param sha256 - an implementation of sha256 (defaults to the internal WASM + * implementation) */ export const encodeBase58AddressFormat = < VersionType extends number = Base58AddressFormatVersion >( - sha256: { hash: Sha256['hash'] }, version: VersionType, - payload: Uint8Array + payload: Uint8Array, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { const checksumBytes = 4; const content = Uint8Array.from([version, ...payload]); @@ -124,38 +127,38 @@ export const encodeBase58AddressFormat = < * returned string will not be a valid Base58Address if `hash` is not exactly 20 * bytes. If needed, validate the length of `hash` before calling this method. * - * For other standards which use the Base58Address format but have other version - * or length requirements, use `encodeCashAddressFormat`. + * For other standards that use the Base58Address format but have other version + * or length requirements, use {@link encodeCashAddressFormat}. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) - * @param type - the type of address to encode: `p2pkh`, `p2sh`, - * `p2pkh-testnet`, or `p2sh-testnet` + * @param type - the type of address to encode: `p2pkh`, `p2sh20`, + * `p2pkh-testnet`, or `p2sh20-testnet` * @param hash - the 20-byte hash to encode * (`RIPEMD160(SHA256(public key or bytecode))`) + * @param sha256 - an implementation of sha256 (defaults to the internal WASM + * implementation) */ export const encodeBase58Address = ( - sha256: { hash: Sha256['hash'] }, type: | 'p2pkh' - | 'p2sh' - | 'p2pkh-testnet' - | 'p2sh-testnet' - | 'p2pkh-copay-bch' - | 'p2sh-copay-bch', - payload: Uint8Array + | 'p2pkhCopayBCH' + | 'p2pkhTestnet' + | 'p2sh20' + | 'p2sh20CopayBCH' + | 'p2sh20Testnet', + payload: Uint8Array, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => encodeBase58AddressFormat( - sha256, { p2pkh: Base58AddressFormatVersion.p2pkh, - 'p2pkh-copay-bch': Base58AddressFormatVersion.p2pkhCopayBCH, - 'p2pkh-testnet': Base58AddressFormatVersion.p2pkhTestnet, - p2sh: Base58AddressFormatVersion.p2sh, - 'p2sh-copay-bch': Base58AddressFormatVersion.p2shCopayBCH, - 'p2sh-testnet': Base58AddressFormatVersion.p2shTestnet, + p2pkhCopayBCH: Base58AddressFormatVersion.p2pkhCopayBCH, + p2pkhTestnet: Base58AddressFormatVersion.p2pkhTestnet, + p2sh20: Base58AddressFormatVersion.p2sh20, + p2sh20CopayBCH: Base58AddressFormatVersion.p2sh20CopayBCH, + p2sh20Testnet: Base58AddressFormatVersion.p2sh20Testnet, }[type], - payload + payload, + sha256 ); export enum Base58AddressError { @@ -168,17 +171,17 @@ export enum Base58AddressError { /** * Attempt to decode a Base58Address-formatted string. This is more lenient than - * `decodeCashAddress`, which also validates the address version. + * {@link decodeCashAddress}, which also validates the address version. * * Returns the contents of the address or an error message as a string. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) * @param address - the string to decode as a base58 address + * @param sha256 - an implementation of sha256 (defaults to the internal WASM + * implementation) */ export const decodeBase58AddressFormat = ( - sha256: { hash: Sha256['hash'] }, - address: string + address: string, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { const checksumBytes = 4; const bin = base58ToBin(address); @@ -203,7 +206,8 @@ export const decodeBase58AddressFormat = ( return { payload: content.slice(1), - version: content[0], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + version: content[0]!, }; }; @@ -211,35 +215,36 @@ export const decodeBase58AddressFormat = ( * Decode and validate a Base58Address, strictly checking the version and * payload length. * - * For other address-like standards which closely follow the Base58Address + * For other address-like standards that closely follow the Base58Address * format (but have alternative version byte requirements), use - * `decodeBase58AddressFormat`. + * {@link decodeBase58AddressFormat}. * * @remarks * Because the Wallet Import Format (WIF) private key serialization format uses * the Base58Address format, some libraries allow WIF key decoding via the same * method as base58 address decoding. This method strictly accepts only - * Base58Address types, but WIF keys can be decoded with `decodePrivateKeyWif`. + * Base58Address types, but WIF keys can be decoded with + * {@link decodePrivateKeyWif}. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) * @param address - the string to decode as a base58 address + * @param sha256 - an implementation of sha256 (defaults to the internal WASM + * implementation) */ export const decodeBase58Address = ( - sha256: { hash: Sha256['hash'] }, - address: string + address: string, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { - const decoded = decodeBase58AddressFormat(sha256, address); + const decoded = decodeBase58AddressFormat(address, sha256); if (typeof decoded === 'string') return decoded; if ( ![ Base58AddressFormatVersion.p2pkh, - Base58AddressFormatVersion.p2sh, + Base58AddressFormatVersion.p2sh20, Base58AddressFormatVersion.p2pkhTestnet, - Base58AddressFormatVersion.p2shTestnet, + Base58AddressFormatVersion.p2sh20Testnet, Base58AddressFormatVersion.p2pkhCopayBCH, - Base58AddressFormatVersion.p2shCopayBCH, + Base58AddressFormatVersion.p2sh20CopayBCH, ].includes(decoded.version) ) { return Base58AddressError.unknownAddressVersion; diff --git a/src/lib/address/bech32.spec.ts b/src/lib/address/bech32.spec.ts index 65418c11..fd3c61b0 100644 --- a/src/lib/address/bech32.spec.ts +++ b/src/lib/address/bech32.spec.ts @@ -1,7 +1,6 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { testProp } from 'ava-fast-check'; -import * as fc from 'fast-check'; +import fc from 'fast-check'; import { Bech32DecodingError, @@ -13,7 +12,7 @@ import { encodeBech32, isBech32CharacterSet, regroupBits, -} from '../lib'; +} from '../lib.js'; test('regroupBits', (t) => { t.deepEqual( @@ -250,15 +249,26 @@ const max5BitNumber = 31; const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => fc - .array(fc.integer(0, maxUint8Number), minLength, maxLength) + .array(fc.integer({ max: maxUint8Number, min: 0 }), { + maxLength, + minLength, + }) .map((a) => Uint8Array.from(a)); const maxBinLength = 100; testProp( '[fast-check] encodeBech32 <-> decodeBech32', - [fc.array(fc.integer(0, max5BitNumber), 0, maxBinLength)], + [ + fc.array(fc.integer({ max: max5BitNumber, min: 0 }), { + maxLength: maxBinLength, + minLength: 0, + }), + ], (t, input) => { - t.deepEqual(decodeBech32(encodeBech32(input)), input); + t.deepEqual( + decodeBech32(encodeBech32(input)), + input as ReturnType + ); } ); diff --git a/src/lib/address/bech32.ts b/src/lib/address/bech32.ts index 89baab4f..5e22f3ac 100644 --- a/src/lib/address/bech32.ts +++ b/src/lib/address/bech32.ts @@ -1,4 +1,4 @@ -import { Immutable } from '../format/format'; +import type { Immutable } from '../lib'; /** * The list of 32 symbols used in Bech32 encoding. @@ -10,7 +10,7 @@ export const bech32CharacterSet = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'; * An object mapping each of the 32 symbols used in Bech32 encoding to their respective index in the character set. */ // prettier-ignore -export const bech32CharacterSetIndex = { q: 0, p: 1, z: 2, r: 3, y: 4, '9': 5, x: 6, '8': 7, g: 8, f: 9, '2': 10, t: 11, v: 12, d: 13, w: 14, '0': 15, s: 16, '3': 17, j: 18, n: 19, '5': 20, '4': 21, k: 22, h: 23, c: 24, e: 25, '6': 26, m: 27, u: 28, a: 29, '7': 30, l: 31 } as const; // eslint-disable-line sort-keys +export const bech32CharacterSetIndex = { q: 0, p: 1, z: 2, r: 3, y: 4, '9': 5, x: 6, '8': 7, g: 8, f: 9, '2': 10, t: 11, v: 12, d: 13, w: 14, '0': 15, s: 16, '3': 17, j: 18, n: 19, '5': 20, '4': 21, k: 22, h: 23, c: 24, e: 25, '6': 26, m: 27, u: 28, a: 29, '7': 30, l: 31 } as const; // eslint-disable-line sort-keys, @typescript-eslint/naming-convention export enum BitRegroupingError { integerOutOfRange = 'An integer provided in the source array is out of the range of the specified source word length.', @@ -28,29 +28,34 @@ export enum BitRegroupingError { * `true`, this method will never error. * * A.K.A. `convertbits` - * - * @param bin - an array of numbers representing the bits to regroup. Each item - * must be a number within the range of `sourceWordLength` - * @param sourceWordLength - the bit-length of each number in `bin`, e.g. to - * regroup bits from a `Uint8Array`, use `8` (must be a positive integer) - * @param resultWordLength - the bit-length of each number in the desired result - * array, e.g. to regroup bits into 4-bit numbers, use `4` (must be a positive - * integer) - * @param allowPadding - whether to allow the use of padding for `bin` values - * where the provided number of bits cannot be directly mapped to an equivalent - * result array (remaining bits are filled with `0`), defaults to `true` - * @privateRemarks - * Derived from: https://github.com/sipa/bech32 */ +// Derived from: https://github.com/sipa/bech32 export const regroupBits = ({ bin, sourceWordLength, resultWordLength, allowPadding = true, }: { + /** + * An array of numbers representing the bits to regroup. Each item must be a + * number within the range of `sourceWordLength`. + */ bin: Immutable | readonly number[]; + /** + * The bit-length of each number in `bin`, e.g. to regroup bits from a + * `Uint8Array`, use `8` (must be a positive integer) + */ sourceWordLength: number; + /** + * The bit-length of each number in the desired result array, e.g. to regroup + * bits into 4-bit numbers, use `4` (must be a positive integer) + */ resultWordLength: number; + /** + * Whether to allow the use of padding for `bin` values where the provided + * number of bits cannot be directly mapped to an equivalent result array + * (remaining bits are filled with `0`), defaults to `true` + */ allowPadding?: boolean; }) => { let accumulator = 0; @@ -59,7 +64,8 @@ export const regroupBits = ({ const maxResultInt = (1 << resultWordLength) - 1; // eslint-disable-next-line functional/no-loop-statement, @typescript-eslint/prefer-for-of, no-plusplus for (let p = 0; p < bin.length; ++p) { - const value = bin[p]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const value = bin[p]!; if (value < 0 || value >> sourceWordLength !== 0) { return BitRegroupingError.integerOutOfRange; } @@ -91,7 +97,8 @@ export const regroupBits = ({ * Encode an array of numbers as a base32 string using the Bech32 character set. * * Note, this method always completes. For a valid result, all items in - * `base32IntegerArray` must be between `0` and `32`. + * `base32IntegerArray` must be between `0` and `32`. To prepare another array + * type for encoding, see {@link regroupBits}. * * @param base32IntegerArray - the array of 5-bit integers to encode */ @@ -100,8 +107,8 @@ export const encodeBech32 = (base32IntegerArray: readonly number[]) => { let result = ''; // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus for (let i = 0; i < base32IntegerArray.length; i++) { - // eslint-disable-next-line functional/no-expression-statement - result += bech32CharacterSet[base32IntegerArray[i]]; + // eslint-disable-next-line functional/no-expression-statement, @typescript-eslint/no-non-null-assertion + result += bech32CharacterSet[base32IntegerArray[i]!]; } return result; }; @@ -111,12 +118,14 @@ export const encodeBech32 = (base32IntegerArray: readonly number[]) => { * * Note, this method always completes. If `validBech32` is not valid bech32, * an incorrect result will be returned. If `validBech32` is potentially - * malformed, check it with `isBech32` before calling this method. + * malformed, check it with {@link isBech32CharacterSet} before calling + * this method. * * @param validBech32 - the bech32-encoded string to decode */ export const decodeBech32 = (validBech32: string) => { - const result: typeof bech32CharacterSetIndex[keyof typeof bech32CharacterSetIndex][] = []; + const result: typeof bech32CharacterSetIndex[keyof typeof bech32CharacterSetIndex][] = + []; // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus for (let i = 0; i < validBech32.length; i++) { // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data @@ -151,7 +160,7 @@ export enum Bech32DecodingError { * 5-bit integers would require padding to be regrouped into 8-bit bytes, this * method returns an error message. * - * This method is the reverse of `binToBech32Padded`. + * This method is the reverse of {@link binToBech32Padded}. * * @param bech32Padded - the padded bech32-encoded string to decode */ @@ -171,7 +180,7 @@ export const bech32PaddedToBin = (bech32Padded: string) => { * Convert a Uint8Array to a padded bech32-encoded string (without a checksum), * adding padding bits as necessary to convert all bytes to 5-bit integers. * - * This method is the reverse of `bech32PaddedToBin`. + * This method is the reverse of {@link bech32PaddedToBin}. * * @param bytes - the Uint8Array to bech32 encode */ diff --git a/src/lib/address/cash-address.spec.ts b/src/lib/address/cash-address.spec.ts index 4273420c..0a36e9de 100644 --- a/src/lib/address/cash-address.spec.ts +++ b/src/lib/address/cash-address.spec.ts @@ -1,11 +1,12 @@ -/* eslint-disable @typescript-eslint/no-magic-numbers, functional/no-expression-statement */ -import test, { Macro } from 'ava'; -import * as fc from 'fast-check'; +import test from 'ava'; +import fc from 'fast-check'; -import { - attemptCashAddressFormatErrorCorrection, +import type { CashAddressAvailableSizesInBits, CashAddressAvailableTypes, +} from '../lib'; +import { + attemptCashAddressFormatErrorCorrection, CashAddressCorrectionError, CashAddressDecodingError, CashAddressEncodingError, @@ -22,12 +23,12 @@ import { encodeCashAddressFormat, encodeCashAddressVersionByte, hexToBin, - instantiateSha256, maskCashAddressPrefix, splitEvery, -} from '../lib'; +} from '../lib.js'; -import * as cashAddrJson from './fixtures/cashaddr.json'; +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import cashAddrJson from './fixtures/cashaddr.json' assert { type: 'json' }; const maxUint8Number = 255; const fcUint8Array = (length: number) => @@ -51,20 +52,20 @@ test('maskCashAddressPrefix', (t) => { test('encodeCashAddressVersionByte', (t) => { t.deepEqual( encodeCashAddressVersionByte(0, 160), - CashAddressVersionByte.P2PKH + CashAddressVersionByte.p2pkh ); t.deepEqual( encodeCashAddressVersionByte(1, 160), - CashAddressVersionByte.P2SH + CashAddressVersionByte.p2sh20 ); }); test('decodeCashAddressVersionByte', (t) => { - t.deepEqual(decodeCashAddressVersionByte(CashAddressVersionByte.P2PKH), { + t.deepEqual(decodeCashAddressVersionByte(CashAddressVersionByte.p2pkh), { bitLength: 160, type: 0, }); - t.deepEqual(decodeCashAddressVersionByte(CashAddressVersionByte.P2SH), { + t.deepEqual(decodeCashAddressVersionByte(CashAddressVersionByte.p2sh20), { bitLength: 160, type: 1, }); @@ -89,7 +90,7 @@ test('encodeCashAddress: works', (t) => { t.deepEqual( encodeCashAddress( CashAddressNetworkPrefix.testnet, - CashAddressVersionByte.P2PKH, + CashAddressVersionByte.p2pkh, hash ), 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' @@ -102,7 +103,7 @@ test('encodeCashAddress: works', (t) => { t.deepEqual( encodeCashAddress( CashAddressNetworkPrefix.mainnet, - CashAddressVersionByte.P2PKH, + CashAddressVersionByte.p2pkh, hash ), 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' @@ -115,7 +116,7 @@ test('encodeCashAddress: works', (t) => { t.deepEqual( encodeCashAddress( CashAddressNetworkPrefix.regtest, - CashAddressVersionByte.P2PKH, + CashAddressVersionByte.p2pkh, hash ), 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' @@ -158,7 +159,7 @@ test('decodeCashAddress: works', (t) => { { hash, prefix: CashAddressNetworkPrefix.testnet, - type: CashAddressType.P2PKH, + type: CashAddressType.p2pkh, } ); @@ -167,7 +168,7 @@ test('decodeCashAddress: works', (t) => { { hash, prefix: CashAddressNetworkPrefix.mainnet, - type: CashAddressType.P2PKH, + type: CashAddressType.p2pkh, } ); t.deepEqual( @@ -180,7 +181,7 @@ test('decodeCashAddress: works', (t) => { { hash, prefix: CashAddressNetworkPrefix.regtest, - type: CashAddressType.P2PKH, + type: CashAddressType.p2pkh, } ); t.deepEqual( @@ -244,7 +245,7 @@ test('decodeCashAddress: works', (t) => { test('CashAddress test vectors', (t) => { cashAddressTestVectors.forEach((vector) => { const { cashaddr } = vector; - const [prefix] = cashaddr.split(':'); + const [prefix] = cashaddr.split(':') as [string]; const payload = hexToBin(vector.payload); const type = vector.type as CashAddressAvailableTypes; const encodeResult = encodeCashAddress(prefix, type, payload); @@ -424,30 +425,24 @@ test('[fast-check] attemptCashAddressErrorCorrection', (t) => { }); }); -const sha256Promise = instantiateSha256(); - -const legacyVectors: Macro<[string, string]> = async ( - t, - base58Address, - cashAddress -) => { - const sha256 = await sha256Promise; - const decodedBase58Address = decodeBase58AddressFormat(sha256, base58Address); - const decodedCashAddress = decodeCashAddress(cashAddress); - if ( - typeof decodedCashAddress === 'string' || - typeof decodedBase58Address === 'string' - ) { - t.fail(); +const legacyVectors = test.macro<[string, string]>({ + exec: (t, base58Address, cashAddress) => { + const decodedBase58Address = decodeBase58AddressFormat(base58Address); + const decodedCashAddress = decodeCashAddress(cashAddress); + if ( + typeof decodedCashAddress === 'string' || + typeof decodedBase58Address === 'string' + ) { + t.fail(); + return undefined; + } + t.deepEqual(decodedBase58Address.payload, decodedCashAddress.hash); return undefined; - } - t.deepEqual(decodedBase58Address.payload, decodedCashAddress.hash); - return undefined; -}; + }, -// eslint-disable-next-line functional/immutable-data -legacyVectors.title = (_, base58Address) => - `CashAddress <-> Legacy Base58 Vectors: ${base58Address}`; + title: (_, base58Address) => + `CashAddress <-> Legacy Base58 Vectors: ${base58Address}`, +}); test( legacyVectors, diff --git a/src/lib/address/cash-address.ts b/src/lib/address/cash-address.ts index 1a43868e..bf890d75 100644 --- a/src/lib/address/cash-address.ts +++ b/src/lib/address/cash-address.ts @@ -1,11 +1,11 @@ -import { Immutable } from '../format/format'; +import type { Immutable } from '../lib'; import { decodeBech32, encodeBech32, isBech32CharacterSet, regroupBits, -} from './bech32'; +} from './bech32.js'; export enum CashAddressNetworkPrefix { mainnet = 'bitcoincash', @@ -14,6 +14,7 @@ export enum CashAddressNetworkPrefix { } export const cashAddressBitToSize = { + /* eslint-disable @typescript-eslint/naming-convention */ 0: 160, 1: 192, 2: 224, @@ -33,6 +34,7 @@ export const cashAddressSizeToBit = { 384: 5, 448: 6, 512: 7, + /* eslint-enable @typescript-eslint/naming-convention */ } as const; /** @@ -41,15 +43,17 @@ export const cashAddressSizeToBit = { * - next 4 bits: Address Type * - 3 least significant bits: Hash Size * - * Only two Address Type values are currently standardized: + * Two Address Type values are currently standardized: * - 0 (`0b0000`): P2PKH - * - 1 (`0b0001`): P2SH + * - 1 (`0b0001`): P2SH20 * - * While both P2PKH and P2SH addresses always use 160 bit hashes, the + * And two are proposed by `CHIP-2022-02-CashTokens`: + * - 2 (`0b0010`): P2PKH + Token Support + * - 3 (`0b0011`): P2SH20 + Token Support + * + * While both P2PKH and P2SH20 addresses always use 160 bit hashes, the * CashAddress specification standardizes other sizes for future use (or use by * other systems), see `CashAddressSizeBit`. - * - * With these constraints, only two version byte values are currently standard. */ export enum CashAddressVersionByte { /** @@ -59,30 +63,45 @@ export enum CashAddressVersionByte { * - Address Type bits: `0000` (P2PKH) * - Size bits: `000` (160 bits) */ - P2PKH = 0b00000000, + p2pkh = 0b00000000, + /** + * 20-byte Pay to Script Hash (P2SH20): `0b00001000` + * + * - Most significant bit: `0` (reserved) + * - Address Type bits: `0001` (P2SH20) + * - Size bits: `000` (160 bits) + */ + p2sh20 = 0b00001000, /** - * Pay to Script Hash (P2SH): `0b00001000` + * Pay to Public Key Hash (P2PKH) With Token Support: `0b00010000` * * - Most significant bit: `0` (reserved) - * - Address Type bits: `0001` (P2SH) + * - Address Type bits: `0010` (P2PKH + Tokens) * - Size bits: `000` (160 bits) */ - P2SH = 0b00001000, + p2pkhWithTokens = 0b00010000, + /** + * 20-byte Pay to Script Hash (P2SH20) With Token Support: `0b00011000` + * - Most significant bit: `0` (reserved) + * - Address Type bits: `0011` (P2SH20 + Tokens) + * - Size bits: `000` (160 bits) + */ + p2sh20WithTokens = 0b00011000, } /** * The address types currently defined in the CashAddress specification. See - * also: `CashAddressVersionByte`. + * also: {@link CashAddressVersionByte}. */ export enum CashAddressType { /** * Pay to Public Key Hash (P2PKH) */ - P2PKH = 0, + p2pkh = 0, /** - * Pay to Script Hash (P2SH) + * Pay to Script Hash (P2SH20) */ - P2SH = 1, + p2sh20 = 1, } const cashAddressTypeBitShift = 3; @@ -96,11 +115,12 @@ export type CashAddressAvailableSizes = keyof typeof cashAddressBitToSize; /** * Encode a CashAddress version byte for the given address type and hash length. - * See `CashAddressVersionByte` for more information. + * See {@link CashAddressVersionByte} for more information. * * The `type` parameter must be a number between `0` and `15`, and `bitLength` * must be one of the standardized lengths. To use the contents of a variable, - * cast it to `CashAddressType` or `CashAddressSize` respectively, e.g.: + * cast it to {@link CashAddressType} or {@link CashAddressSize} respectively, + * e.g.: * ```ts * const type = 3 as CashAddressType; * const size = 160 as CashAddressSize; @@ -149,8 +169,8 @@ export const decodeCashAddressVersionByte = (version: number) => const asciiCaseInsensitiveBits = 0b11111; /** - * Convert a string into an array of 5-bit numbers, representing the - * characters in a case-insensitive way. + * Convert a string into an array of 5-bit numbers, representing the characters + * in a case-insensitive way. * @param prefix - the prefix to mask */ export const maskCashAddressPrefix = (prefix: string) => { @@ -176,7 +196,7 @@ const bech32GeneratorRemainingBytes = [0xf2bc8e61, 0xb76d99e2, 0x3e5fb3c4, 0x2ea * A.K.A. `PolyMod` * * @remarks - * Notes from Bitcoin ABC: + * Notes from C++ implementation: * This function will compute what 8 5-bit values to XOR into the last 8 input * values, in order to make the checksum 0. These 8 values are packed together * in a single 40-bit integer. The higher bits correspond to earlier values. @@ -213,12 +233,9 @@ const bech32GeneratorRemainingBytes = [0xf2bc8e61, 0xb76d99e2, 0x3e5fb3c4, 0x2ea * corresponds to x^2 + v0*x + v1 mod g(x). As 1 mod g(x) = 1, that is the * starting value for `c`. * - * @privateRemarks - * Derived from the `bitcore-lib-cash` implementation, which does not require - * BigInt: https://github.com/bitpay/bitcore - * * @param v - Array of 5-bit integers over which the checksum is to be computed */ +// Derived from the `bitcore-lib-cash` implementation (does not require BigInt): https://github.com/bitpay/bitcore export const cashAddressPolynomialModulo = (v: readonly number[]) => { /* eslint-disable functional/no-let, functional/no-loop-statement, functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers */ let mostSignificantByte = 0; @@ -232,13 +249,16 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { mostSignificantByte |= lowerBytes >>> 27; lowerBytes &= 0x07ffffff; lowerBytes <<= 5; - lowerBytes ^= v[j]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + lowerBytes ^= v[j]!; // eslint-disable-next-line no-plusplus for (let i = 0; i < bech32GeneratorMostSignificantByte.length; ++i) { // eslint-disable-next-line functional/no-conditional-statement if (c & (1 << i)) { - mostSignificantByte ^= bech32GeneratorMostSignificantByte[i]; - lowerBytes ^= bech32GeneratorRemainingBytes[i]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + mostSignificantByte ^= bech32GeneratorMostSignificantByte[i]!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + lowerBytes ^= bech32GeneratorRemainingBytes[i]!; } } } @@ -256,9 +276,10 @@ const base32WordLength = 5; const base256WordLength = 8; /** - * Convert the checksum returned by `cashAddressPolynomialModulo` to an array of - * 5-bit positive integers which can be Base32 encoded. - * @param checksum - a 40 bit checksum returned by `cashAddressPolynomialModulo` + * Convert the checksum returned by {@link cashAddressPolynomialModulo} to an + * array of 5-bit positive integers that can be Base32 encoded. + * @param checksum - a 40 bit checksum returned by + * {@link cashAddressPolynomialModulo} */ export const cashAddressChecksumToUint5Array = (checksum: number) => { const result = []; @@ -278,7 +299,7 @@ const payloadSeparator = 0; /** * Encode a hash as a CashAddress-like string using the CashAddress format. * - * To encode a standard CashAddress, use `encodeCashAddress`. + * To encode a standard CashAddress, use {@link encodeCashAddress}. * * @param prefix - a valid prefix indicating the network for which to encode the * address – must be only lowercase letters @@ -327,13 +348,13 @@ const isValidBitLength = ( * Encode a hash as a CashAddress. * * Note, this method does not enforce error handling via the type system. The - * returned string may be a `CashAddressEncodingError.unsupportedHashLength` - * if `hash` is not a valid length. Check the result if the input is potentially - * malformed. + * returned string may be a + * {@link CashAddressEncodingError.unsupportedHashLength} if `hash` is not a + * valid length. Check the result if the input is potentially malformed. * - * For other address standards which closely follow the CashAddress + * For other address standards that closely follow the CashAddress * specification (but have alternative version byte requirements), use - * `encodeCashAddressFormat`. + * {@link encodeCashAddressFormat}. * * @param prefix - a valid prefix indicating the network for which to encode the * address (usually a `CashAddressNetworkPrefix`) – must be only lowercase @@ -373,12 +394,12 @@ export enum CashAddressDecodingError { /** * Decode and validate a string using the CashAddress format. This is more - * lenient than `decodeCashAddress`, which also validates the contents of the - * version byte. + * lenient than {@link decodeCashAddress}, which also validates the contents of + * the version byte. * * Note, this method requires `address` to include a network prefix. To * decode a string with an unknown prefix, try - * `decodeCashAddressFormatWithoutPrefix`. + * {@link decodeCashAddressFormatWithoutPrefix}. * * @param address - the CashAddress-like string to decode */ @@ -389,7 +410,7 @@ export const decodeCashAddressFormat = (address: string) => { if (parts.length !== 2 || parts[0] === '' || parts[1] === '') { return CashAddressDecodingError.invalidFormat; } - const [prefix, payload] = parts; + const [prefix, payload] = parts as [string, string]; if (!isBech32CharacterSet(payload)) { return CashAddressDecodingError.invalidCharacters; } @@ -416,7 +437,7 @@ export const decodeCashAddressFormat = (address: string) => { return CashAddressDecodingError.improperPadding; } - const [version, ...hashContents] = payloadContents; + const [version, ...hashContents] = payloadContents as [number, ...number[]]; const hash = Uint8Array.from(hashContents); return { hash, prefix, version }; @@ -427,13 +448,13 @@ export const decodeCashAddressFormat = (address: string) => { * according to the CashAddress specification. This is important for error * detection in CashAddresses. * - * For other address-like standards which closely follow the CashAddress + * For other address-like standards that closely follow the CashAddress * specification (but have alternative version byte requirements), use - * `decodeCashAddressFormat`. + * {@link decodeCashAddressFormat}. * * Note, this method requires that CashAddresses include a network prefix. To * decode an address with an unknown prefix, try - * `decodeCashAddressFormatWithoutPrefix`. + * {@link decodeCashAddressFormatWithoutPrefix}. * * @param address - the CashAddress to decode */ @@ -461,7 +482,7 @@ export const decodeCashAddress = (address: string) => { /** * Attempt to decode and validate a CashAddress against a list of possible - * prefixes. If the correct prefix is known, use `decodeCashAddress`. + * prefixes. If the correct prefix is known, use {@link decodeCashAddress}. * * @param address - the CashAddress to decode * @param possiblePrefixes - the network prefixes to try @@ -532,7 +553,7 @@ const finiteFieldOrder = 32; * effectively equivalent to burning the funds. * * Only 2 substitution errors can be corrected (or a single swap) – deletions - * and insertions (errors which shift many other characters and change the + * and insertions (errors that shift many other characters and change the * length of the payload) can never be safely corrected and will produce an * error. * @@ -542,11 +563,9 @@ const finiteFieldOrder = 32; * `bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfdecc` can be corrected, while * `typo:qq2azmyyv6dtgczexyalqar70q036yund53jvfdecc` can not. * - * @privateRemarks - * Derived from: https://github.com/deadalnix/cashaddressed - * * @param address - the CashAddress on which to attempt error correction */ +// Derived from: https://github.com/deadalnix/cashaddressed // eslint-disable-next-line complexity export const attemptCashAddressFormatErrorCorrection = (address: string) => { const parts = address.toLowerCase().split(':'); @@ -554,7 +573,7 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { if (parts.length !== 2 || parts[0] === '' || parts[1] === '') { return CashAddressDecodingError.invalidFormat; } - const [prefix, payload] = parts; + const [prefix, payload] = parts as [string, string]; if (!isBech32CharacterSet(payload)) { return CashAddressDecodingError.invalidCharacters; } @@ -599,7 +618,7 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { for (const [s0, pe] of Object.entries(syndromes)) { // eslint-disable-next-line no-bitwise const s1Location = (BigInt(s0) ^ BigInt(originalChecksum)).toString(); - const s1 = syndromes[s1Location] as number | undefined; + const s1 = syndromes[s1Location]; if (s1 !== undefined) { const correctionIndex1 = Math.trunc(pe / finiteFieldOrder); const correctionIndex2 = Math.trunc(s1 / finiteFieldOrder); diff --git a/src/lib/address/locking-bytecode.spec.ts b/src/lib/address/locking-bytecode.spec.ts index 0c54b3d0..8a379d7b 100644 --- a/src/lib/address/locking-bytecode.spec.ts +++ b/src/lib/address/locking-bytecode.spec.ts @@ -1,5 +1,4 @@ -/* eslint-disable functional/no-expression-statement */ -import test, { Macro } from 'ava'; +import test from 'ava'; import { addressContentsToLockingBytecode, @@ -11,14 +10,12 @@ import { CashAddressNetworkPrefix, cashAddressToLockingBytecode, hexToBin, - instantiateSha256, LockingBytecodeEncodingError, lockingBytecodeToAddressContents, lockingBytecodeToBase58Address, lockingBytecodeToCashAddress, -} from '../lib'; - -const sha256Promise = instantiateSha256(); + sha256, +} from '../lib.js'; test('lockingBytecode <-> AddressContents: P2PK', (t) => { const genesisCoinbase = hexToBin( @@ -77,19 +74,19 @@ test('lockingBytecode <-> AddressContents: P2PKH', (t) => { ); }); -test('lockingBytecode <-> AddressContents: P2SH', (t) => { - const p2sh = hexToBin('a91474f209f6ea907e2ea48f74fae05782ae8a66525787'); +test('lockingBytecode <-> AddressContents: P2SH20', (t) => { + const p2sh20 = hexToBin('a91474f209f6ea907e2ea48f74fae05782ae8a66525787'); const expectedPayload = hexToBin('74f209f6ea907e2ea48f74fae05782ae8a665257'); - t.deepEqual(lockingBytecodeToAddressContents(p2sh), { + t.deepEqual(lockingBytecodeToAddressContents(p2sh20), { payload: expectedPayload, - type: AddressType.p2sh, + type: AddressType.p2sh20, }); t.deepEqual( addressContentsToLockingBytecode({ payload: expectedPayload, - type: AddressType.p2sh, + type: AddressType.p2sh20, }), - p2sh + p2sh20 ); }); @@ -109,7 +106,7 @@ test('lockingBytecode <-> AddressContents: unknown', (t) => { const almostP2pk = hexToBin('0100ac'); const almostP2pkh = hexToBin('76a9010088ac'); - const almostP2sh = hexToBin('a9010087'); + const almostP2sh20 = hexToBin('a9010087'); t.deepEqual(lockingBytecodeToAddressContents(almostP2pk), { payload: almostP2pk, @@ -121,8 +118,8 @@ test('lockingBytecode <-> AddressContents: unknown', (t) => { type: AddressType.unknown, }); - t.deepEqual(lockingBytecodeToAddressContents(almostP2sh), { - payload: almostP2sh, + t.deepEqual(lockingBytecodeToAddressContents(almostP2sh20), { + payload: almostP2sh20, type: AddressType.unknown, }); }); @@ -130,7 +127,7 @@ test('lockingBytecode <-> AddressContents: unknown', (t) => { test('lockingBytecodeToAddressContents: improperly sized scripts return AddressType.unknown', (t) => { const almostP2pk = hexToBin('0100ac'); const almostP2pkh = hexToBin('76a9010088ac'); - const almostP2sh = hexToBin('a9010087'); + const almostP2sh20 = hexToBin('a9010087'); t.deepEqual(lockingBytecodeToAddressContents(almostP2pk), { payload: almostP2pk, @@ -142,26 +139,26 @@ test('lockingBytecodeToAddressContents: improperly sized scripts return AddressT type: AddressType.unknown, }); - t.deepEqual(lockingBytecodeToAddressContents(almostP2sh), { - payload: almostP2sh, + t.deepEqual(lockingBytecodeToAddressContents(almostP2sh20), { + payload: almostP2sh20, type: AddressType.unknown, }); }); -const cashVectors: Macro<[string, string]> = (t, cashAddress, bytecode) => { - t.deepEqual(cashAddressToLockingBytecode(cashAddress), { - bytecode: hexToBin(bytecode), - prefix: 'bitcoincash', - }); - t.deepEqual( - lockingBytecodeToCashAddress(hexToBin(bytecode), 'bitcoincash'), - cashAddress - ); -}; - -// eslint-disable-next-line functional/immutable-data -cashVectors.title = (_, cashAddress) => - `cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: ${cashAddress}`; +const cashVectors = test.macro<[string, string]>({ + exec: (t, cashAddress, bytecode) => { + t.deepEqual(cashAddressToLockingBytecode(cashAddress), { + bytecode: hexToBin(bytecode), + prefix: 'bitcoincash', + }); + t.deepEqual( + lockingBytecodeToCashAddress(hexToBin(bytecode), 'bitcoincash'), + cashAddress + ); + }, + title: (_, cashAddress) => + `cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: ${cashAddress}`, +}); test( cashVectors, @@ -236,12 +233,12 @@ test('lockingBytecodeToCashAddress: P2PK', (t) => { ); }); -test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH', (t) => { - const p2sh = hexToBin('a91474f209f6ea907e2ea48f74fae05782ae8a66525787'); +test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH20', (t) => { + const p2sh20 = hexToBin('a91474f209f6ea907e2ea48f74fae05782ae8a66525787'); const address = 'bitcoincash:pp60yz0ka2g8ut4y3a604czhs2hg5ejj2ugn82jfsr'; - t.deepEqual(lockingBytecodeToCashAddress(p2sh, 'bitcoincash'), address); + t.deepEqual(lockingBytecodeToCashAddress(p2sh20, 'bitcoincash'), address); t.deepEqual(cashAddressToLockingBytecode(address), { - bytecode: p2sh, + bytecode: p2sh20, prefix: 'bitcoincash', }); }); @@ -276,8 +273,7 @@ test('cashAddressToLockingBytecode: error', (t) => { ); }); -test('lockingBytecodeToBase58Address: P2PK', async (t) => { - const sha256 = await sha256Promise; +test('lockingBytecodeToBase58Address: P2PK', (t) => { const genesisCoinbase = hexToBin( '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' ); @@ -286,7 +282,7 @@ test('lockingBytecodeToBase58Address: P2PK', async (t) => { ); t.deepEqual( - lockingBytecodeToBase58Address(sha256, genesisCoinbase, 'mainnet'), + lockingBytecodeToBase58Address(genesisCoinbase, 'mainnet', sha256), { payload: genesisPublicKey, type: AddressType.p2pk, @@ -301,9 +297,9 @@ test('lockingBytecodeToBase58Address: P2PK', async (t) => { ); t.deepEqual( lockingBytecodeToBase58Address( - sha256, genesisCoinbaseCompressed, - 'testnet' + 'testnet', + sha256 ), { payload: compressedPublicKey, @@ -312,8 +308,7 @@ test('lockingBytecodeToBase58Address: P2PK', async (t) => { ); }); -test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2PKH', async (t) => { - const sha256 = await sha256Promise; +test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2PKH', (t) => { const p2pkh = hexToBin('76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac'); // cspell: disable-next-line const address = '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu'; @@ -321,70 +316,59 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2PKH', const addressTestnet = 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx'; // cspell: disable-next-line const addressCopay = 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp'; + t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'mainnet'), address); t.deepEqual( - lockingBytecodeToBase58Address(sha256, p2pkh, 'mainnet'), - address - ); - t.deepEqual( - lockingBytecodeToBase58Address(sha256, p2pkh, 'testnet'), + lockingBytecodeToBase58Address(p2pkh, 'testnet', sha256), addressTestnet ); - t.deepEqual( - lockingBytecodeToBase58Address(sha256, p2pkh, 'copay-bch'), - addressCopay - ); + t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'copayBCH'), addressCopay); - t.deepEqual(base58AddressToLockingBytecode(sha256, address), { + t.deepEqual(base58AddressToLockingBytecode(address), { bytecode: p2pkh, version: Base58AddressFormatVersion.p2pkh, }); - t.deepEqual(base58AddressToLockingBytecode(sha256, addressTestnet), { + t.deepEqual(base58AddressToLockingBytecode(addressTestnet), { bytecode: p2pkh, version: Base58AddressFormatVersion.p2pkhTestnet, }); - t.deepEqual(base58AddressToLockingBytecode(sha256, addressCopay), { + t.deepEqual(base58AddressToLockingBytecode(addressCopay, sha256), { bytecode: p2pkh, version: Base58AddressFormatVersion.p2pkhCopayBCH, }); }); -test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH', async (t) => { - const sha256 = await sha256Promise; - const p2sh = hexToBin('a91476a04053bda0a88bda5177b86a15c3b29f55987387'); +test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH20', (t) => { + const p2sh20 = hexToBin('a91476a04053bda0a88bda5177b86a15c3b29f55987387'); // cspell: disable-next-line const address = '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC'; // cspell: disable-next-line const addressTestnet = '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W'; // cspell: disable-next-line const addressCopay = 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT'; - t.deepEqual(lockingBytecodeToBase58Address(sha256, p2sh, 'mainnet'), address); + t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'mainnet'), address); t.deepEqual( - lockingBytecodeToBase58Address(sha256, p2sh, 'testnet'), + lockingBytecodeToBase58Address(p2sh20, 'testnet', sha256), addressTestnet ); - t.deepEqual( - lockingBytecodeToBase58Address(sha256, p2sh, 'copay-bch'), - addressCopay - ); + t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'copayBCH'), addressCopay); - t.deepEqual(base58AddressToLockingBytecode(sha256, address), { - bytecode: p2sh, - version: Base58AddressFormatVersion.p2sh, + t.deepEqual(base58AddressToLockingBytecode(address), { + bytecode: p2sh20, + version: Base58AddressFormatVersion.p2sh20, }); - t.deepEqual(base58AddressToLockingBytecode(sha256, addressTestnet), { - bytecode: p2sh, - version: Base58AddressFormatVersion.p2shTestnet, + t.deepEqual(base58AddressToLockingBytecode(addressTestnet), { + bytecode: p2sh20, + version: Base58AddressFormatVersion.p2sh20Testnet, }); - t.deepEqual(base58AddressToLockingBytecode(sha256, addressCopay), { - bytecode: p2sh, - version: Base58AddressFormatVersion.p2shCopayBCH, + t.deepEqual(base58AddressToLockingBytecode(addressCopay, sha256), { + bytecode: p2sh20, + version: Base58AddressFormatVersion.p2sh20CopayBCH, }); }); -test('base58AddressToLockingBytecode: error', async (t) => { - const sha256 = await sha256Promise; +test('base58AddressToLockingBytecode: error', (t) => { t.deepEqual( - base58AddressToLockingBytecode(sha256, 'bad:address'), + base58AddressToLockingBytecode('bad:address'), Base58AddressError.unknownCharacter ); }); diff --git a/src/lib/address/locking-bytecode.ts b/src/lib/address/locking-bytecode.ts index d6c85c22..72ed0a9e 100644 --- a/src/lib/address/locking-bytecode.ts +++ b/src/lib/address/locking-bytecode.ts @@ -1,31 +1,33 @@ -import { Sha256 } from '../crypto/crypto'; -import { OpcodesCommon } from '../vm/instruction-sets/common/opcodes'; +import { sha256 as internalSha256 } from '../crypto/default-crypto-instances.js'; +import type { + Base58AddressNetwork, + CashAddressNetworkPrefix, + Sha256, +} from '../lib'; import { Base58AddressFormatVersion, - Base58AddressNetwork, decodeBase58Address, encodeBase58AddressFormat, -} from './base58-address'; +} from './base58-address.js'; import { - CashAddressNetworkPrefix, CashAddressType, decodeCashAddress, encodeCashAddress, -} from './cash-address'; +} from './cash-address.js'; /** * The most common address types used on bitcoin and bitcoin-like networks. Each * address type represents a commonly used locking bytecode pattern. * * @remarks - * Addresses are strings which encode information about the network and + * Addresses are strings that encode information about the network and * `lockingBytecode` to which a transaction output can pay. * * Several address formats exist – `Base58Address` was the format used by the * original satoshi client, and is still in use on several active chains (see - * `encodeBase58Address`). On Bitcoin Cash, the `CashAddress` standard is most - * common (See `encodeCashAddress`). + * {@link encodeBase58Address}). On Bitcoin Cash, the `CashAddress` standard is + * most common (See {@link encodeCashAddress}). */ export enum AddressType { /** @@ -43,10 +45,11 @@ export enum AddressType { */ p2pkh = 'P2PKH', /** - * Pay to Script Hash (P2SH). An address type which locks funds to the hash of - * a script provided in the spending transaction. See BIP13 for details. + * 20-byte Pay to Script Hash (P2SH20). An address type that locks funds to + * the 20-byte hash of a script provided in the spending transaction. See + * BIPs 13 and 16 for details. */ - p2sh = 'P2SH', + p2sh20 = 'P2SH20', /** * This `AddressType` represents an address using an unknown or uncommon * locking bytecode pattern for which no standardized address formats exist. @@ -65,90 +68,155 @@ export interface AddressContents { payload: Uint8Array; } +const enum Opcodes { + OP_0 = 0x00, + OP_PUSHBYTES_20 = 0x14, + OP_PUSHBYTES_33 = 0x21, + OP_PUSHBYTES_65 = 0x41, + OP_DUP = 0x76, + OP_EQUAL = 0x87, + OP_EQUALVERIFY = 0x88, + OP_SHA256 = 0xa8, + OP_HASH160 = 0xa9, + OP_CHECKSIG = 0xac, +} + +const enum PayToPublicKeyUncompressed { + length = 67, + lastElement = 66, +} + +export const isPayToPublicKeyUncompressed = (lockingBytecode: Uint8Array) => + lockingBytecode.length === PayToPublicKeyUncompressed.length && + lockingBytecode[0] === Opcodes.OP_PUSHBYTES_65 && + lockingBytecode[PayToPublicKeyUncompressed.lastElement] === + Opcodes.OP_CHECKSIG; + +const enum PayToPublicKeyCompressed { + length = 35, + lastElement = 34, +} + +export const isPayToPublicKeyCompressed = (lockingBytecode: Uint8Array) => + lockingBytecode.length === PayToPublicKeyCompressed.length && + lockingBytecode[0] === Opcodes.OP_PUSHBYTES_33 && + lockingBytecode[PayToPublicKeyCompressed.lastElement] === Opcodes.OP_CHECKSIG; + +export const isPayToPublicKey = (lockingBytecode: Uint8Array) => + isPayToPublicKeyCompressed(lockingBytecode) || + isPayToPublicKeyUncompressed(lockingBytecode); + +const enum PayToPublicKeyHash { + length = 25, + lastElement = 24, +} + +// eslint-disable-next-line complexity +export const isPayToPublicKeyHash = (lockingBytecode: Uint8Array) => + lockingBytecode.length === PayToPublicKeyHash.length && + lockingBytecode[0] === Opcodes.OP_DUP && + lockingBytecode[1] === Opcodes.OP_HASH160 && + lockingBytecode[2] === Opcodes.OP_PUSHBYTES_20 && + lockingBytecode[23] === Opcodes.OP_EQUALVERIFY && + lockingBytecode[24] === Opcodes.OP_CHECKSIG; + +const enum PayToScriptHash20 { + length = 23, + lastElement = 22, +} + +export const isPayToScriptHash20 = (lockingBytecode: Uint8Array) => + lockingBytecode.length === PayToScriptHash20.length && + lockingBytecode[0] === Opcodes.OP_HASH160 && + lockingBytecode[1] === Opcodes.OP_PUSHBYTES_20 && + lockingBytecode[PayToScriptHash20.lastElement] === Opcodes.OP_EQUAL; + +const enum AddressPayload { + p2pkhStart = 3, + p2pkhEnd = 23, + p2sh20Start = 2, + p2sh20End = 22, + p2pkUncompressedStart = 1, + p2pkUncompressedEnd = 66, + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values + p2pkCompressedStart = 1, + p2pkCompressedEnd = 34, +} + /** * Attempt to match a lockingBytecode to a standard address type for use in - * address encoding. (See `AddressType` for details.) + * address encoding. (See {@link AddressType} for details.) * * For a locking bytecode matching the Pay to Public Key Hash (P2PKH) pattern, - * the returned `type` is `AddressType.p2pkh` and `payload` is the `HASH160` of - * the public key. + * the returned `type` is {@link AddressType.p2pkh} and `payload` is the + * `HASH160` of the public key. * - * For a locking bytecode matching the Pay to Script Hash (P2SH) pattern, the - * returned `type` is `AddressType.p2sh` and `payload` is the `HASH160` of the - * redeeming bytecode, A.K.A. "redeem script hash". + * For a locking bytecode matching the 20-byte Pay to Script Hash (P2SH20) + * pattern, the returned `type` is {@link AddressType.p2sh20} and `payload` is + * the `HASH160` of the redeeming bytecode, A.K.A. "redeem script hash". * * For a locking bytecode matching the Pay to Public Key (P2PK) pattern, the - * returned `type` is `AddressType.p2pk` and `payload` is the full public key. + * returned `type` is {@link AddressType.p2pk} and `payload` is the full + * public key. * - * Any other locking bytecode will return a `type` of `AddressType.unknown` and - * a payload of the unmodified `bytecode`. + * Any other locking bytecode will return a `type` of + * {@link AddressType.unknown} and a payload of the unmodified `bytecode`. * * @param bytecode - the locking bytecode to match */ -// eslint-disable-next-line complexity + export const lockingBytecodeToAddressContents = ( bytecode: Uint8Array ): AddressContents => { - const p2pkhLength = 25; - if ( - bytecode.length === p2pkhLength && - bytecode[0] === OpcodesCommon.OP_DUP && - bytecode[1] === OpcodesCommon.OP_HASH160 && - bytecode[2] === OpcodesCommon.OP_PUSHBYTES_20 && - bytecode[23] === OpcodesCommon.OP_EQUALVERIFY && - bytecode[24] === OpcodesCommon.OP_CHECKSIG - ) { - const start = 3; - const end = 23; - return { payload: bytecode.slice(start, end), type: AddressType.p2pkh }; + if (isPayToPublicKeyHash(bytecode)) { + return { + payload: bytecode.slice( + AddressPayload.p2pkhStart, + AddressPayload.p2pkhEnd + ), + type: AddressType.p2pkh, + }; } - const p2shLength = 23; - if ( - bytecode.length === p2shLength && - bytecode[0] === OpcodesCommon.OP_HASH160 && - bytecode[1] === OpcodesCommon.OP_PUSHBYTES_20 && - bytecode[22] === OpcodesCommon.OP_EQUAL - ) { - const start = 2; - const end = 22; - return { payload: bytecode.slice(start, end), type: AddressType.p2sh }; + if (isPayToScriptHash20(bytecode)) { + return { + payload: bytecode.slice( + AddressPayload.p2sh20Start, + AddressPayload.p2sh20End + ), + type: AddressType.p2sh20, + }; } - const p2pkUncompressedLength = 67; - if ( - bytecode.length === p2pkUncompressedLength && - bytecode[0] === OpcodesCommon.OP_PUSHBYTES_65 && - bytecode[66] === OpcodesCommon.OP_CHECKSIG - ) { - const start = 1; - const end = 66; - return { payload: bytecode.slice(start, end), type: AddressType.p2pk }; + if (isPayToPublicKeyUncompressed(bytecode)) { + return { + payload: bytecode.slice( + AddressPayload.p2pkUncompressedStart, + AddressPayload.p2pkUncompressedEnd + ), + type: AddressType.p2pk, + }; } - const p2pkCompressedLength = 35; - if ( - bytecode.length === p2pkCompressedLength && - bytecode[0] === OpcodesCommon.OP_PUSHBYTES_33 && - bytecode[34] === OpcodesCommon.OP_CHECKSIG - ) { - const start = 1; - const end = 34; - return { payload: bytecode.slice(start, end), type: AddressType.p2pk }; + if (isPayToPublicKeyCompressed(bytecode)) { + return { + payload: bytecode.slice( + AddressPayload.p2pkCompressedStart, + AddressPayload.p2pkCompressedEnd + ), + type: AddressType.p2pk, + }; } - return { - payload: bytecode.slice(), - type: AddressType.unknown, - }; + return { payload: bytecode.slice(), type: AddressType.unknown }; }; /** - * Get the locking bytecode for a valid `AddressContents` object. See - * `lockingBytecodeToAddressContents` for details. + * Get the locking bytecode for a valid {@link AddressContents}. See + * {@link lockingBytecodeToAddressContents} for details. * - * For `AddressContents` of `type` `AddressType.unknown`, this method returns - * the `payload` without modification. + * For {@link AddressContents} of `type` {@link AddressType.unknown}, this + * method returns the `payload` without modification. * * @param addressContents - the `AddressContents` to encode */ @@ -157,34 +225,34 @@ export const addressContentsToLockingBytecode = ( ) => { if (addressContents.type === AddressType.p2pkh) { return Uint8Array.from([ - OpcodesCommon.OP_DUP, - OpcodesCommon.OP_HASH160, - OpcodesCommon.OP_PUSHBYTES_20, + Opcodes.OP_DUP, + Opcodes.OP_HASH160, + Opcodes.OP_PUSHBYTES_20, ...addressContents.payload, - OpcodesCommon.OP_EQUALVERIFY, - OpcodesCommon.OP_CHECKSIG, + Opcodes.OP_EQUALVERIFY, + Opcodes.OP_CHECKSIG, ]); } - if (addressContents.type === AddressType.p2sh) { + if (addressContents.type === AddressType.p2sh20) { return Uint8Array.from([ - OpcodesCommon.OP_HASH160, - OpcodesCommon.OP_PUSHBYTES_20, + Opcodes.OP_HASH160, + Opcodes.OP_PUSHBYTES_20, ...addressContents.payload, - OpcodesCommon.OP_EQUAL, + Opcodes.OP_EQUAL, ]); } if (addressContents.type === AddressType.p2pk) { const compressedPublicKeyLength = 33; return addressContents.payload.length === compressedPublicKeyLength ? Uint8Array.from([ - OpcodesCommon.OP_PUSHBYTES_33, + Opcodes.OP_PUSHBYTES_33, ...addressContents.payload, - OpcodesCommon.OP_CHECKSIG, + Opcodes.OP_CHECKSIG, ]) : Uint8Array.from([ - OpcodesCommon.OP_PUSHBYTES_65, + Opcodes.OP_PUSHBYTES_65, ...addressContents.payload, - OpcodesCommon.OP_CHECKSIG, + Opcodes.OP_CHECKSIG, ]); } return addressContents.payload; @@ -193,11 +261,11 @@ export const addressContentsToLockingBytecode = ( /** * Encode a locking bytecode as a CashAddress given a network prefix. * - * If `bytecode` matches either the P2PKH or P2SH pattern, it is encoded using - * the proper address type and returned as a valid CashAddress (string). + * If `bytecode` matches a standard pattern, it is encoded using the proper + * address type and returned as a valid CashAddress (string). * * If `bytecode` cannot be encoded as an address (i.e. because the pattern is - * not standard), the resulting `AddressContents` is returned. + * not standard), the resulting {@link AddressContents} is returned. * * @param bytecode - the locking bytecode to encode * @param prefix - the network prefix to use, e.g. `bitcoincash`, `bchtest`, or @@ -211,10 +279,10 @@ export const lockingBytecodeToCashAddress = < ) => { const contents = lockingBytecodeToAddressContents(bytecode); if (contents.type === AddressType.p2pkh) { - return encodeCashAddress(prefix, CashAddressType.P2PKH, contents.payload); + return encodeCashAddress(prefix, CashAddressType.p2pkh, contents.payload); } - if (contents.type === AddressType.p2sh) { - return encodeCashAddress(prefix, CashAddressType.P2SH, contents.payload); + if (contents.type === AddressType.p2sh20) { + return encodeCashAddress(prefix, CashAddressType.p2sh20, contents.payload); } return contents; @@ -236,7 +304,7 @@ export const cashAddressToLockingBytecode = (address: string) => { const decoded = decodeCashAddress(address); if (typeof decoded === 'string') return decoded; - if (decoded.type === CashAddressType.P2PKH) { + if (decoded.type === CashAddressType.p2pkh) { return { bytecode: addressContentsToLockingBytecode({ payload: decoded.hash, @@ -246,11 +314,11 @@ export const cashAddressToLockingBytecode = (address: string) => { }; } - if (decoded.type === CashAddressType.P2SH) { + if (decoded.type === CashAddressType.p2sh20) { return { bytecode: addressContentsToLockingBytecode({ payload: decoded.hash, - type: AddressType.p2sh, + type: AddressType.p2sh20, }), prefix: decoded.prefix, }; @@ -262,45 +330,45 @@ export const cashAddressToLockingBytecode = (address: string) => { /** * Encode a locking bytecode as a Base58Address for a given network. * - * If `bytecode` matches either the P2PKH or P2SH pattern, it is encoded using - * the proper address type and returned as a valid Base58Address (string). + * If `bytecode` matches a standard pattern, it is encoded using the proper + * address type and returned as a valid Base58Address (string). * * If `bytecode` cannot be encoded as an address (i.e. because the pattern is - * not standard), the resulting `AddressContents` is returned. + * not standard), the resulting {@link AddressContents} is returned. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) * @param bytecode - the locking bytecode to encode * @param network - the network for which to encode the address (`mainnet` or * `testnet`) + * @param sha256 - an implementation of sha256 (defaults to the internal WASM + * implementation) */ export const lockingBytecodeToBase58Address = ( - sha256: { hash: Sha256['hash'] }, bytecode: Uint8Array, - network: Base58AddressNetwork + network: Base58AddressNetwork, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { const contents = lockingBytecodeToAddressContents(bytecode); if (contents.type === AddressType.p2pkh) { return encodeBase58AddressFormat( - sha256, { - 'copay-bch': Base58AddressFormatVersion.p2pkhCopayBCH, + copayBCH: Base58AddressFormatVersion.p2pkhCopayBCH, mainnet: Base58AddressFormatVersion.p2pkh, testnet: Base58AddressFormatVersion.p2pkhTestnet, }[network], - contents.payload + contents.payload, + sha256 ); } - if (contents.type === AddressType.p2sh) { + if (contents.type === AddressType.p2sh20) { return encodeBase58AddressFormat( - sha256, { - 'copay-bch': Base58AddressFormatVersion.p2shCopayBCH, - mainnet: Base58AddressFormatVersion.p2sh, - testnet: Base58AddressFormatVersion.p2shTestnet, + copayBCH: Base58AddressFormatVersion.p2sh20CopayBCH, + mainnet: Base58AddressFormatVersion.p2sh20, + testnet: Base58AddressFormatVersion.p2sh20Testnet, }[network], - contents.payload + contents.payload, + sha256 ); } @@ -316,10 +384,10 @@ export const lockingBytecodeToBase58Address = ( * @param address - the CashAddress to convert */ export const base58AddressToLockingBytecode = ( - sha256: { hash: Sha256['hash'] }, - address: string + address: string, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { - const decoded = decodeBase58Address(sha256, address); + const decoded = decodeBase58Address(address, sha256); if (typeof decoded === 'string') return decoded; return { @@ -331,7 +399,7 @@ export const base58AddressToLockingBytecode = ( Base58AddressFormatVersion.p2pkhTestnet, ].includes(decoded.version) ? AddressType.p2pkh - : AddressType.p2sh, + : AddressType.p2sh20, }), version: decoded.version, }; diff --git a/src/lib/bin/bin.ts b/src/lib/bin/bin.ts index 54e3a4ef..b6ea0d2b 100644 --- a/src/lib/bin/bin.ts +++ b/src/lib/bin/bin.ts @@ -1,6 +1,6 @@ -export * from './hashes'; -export * from './ripemd160/ripemd160.base64'; -export * from './secp256k1/secp256k1-wasm'; -export * from './sha1/sha1.base64'; -export * from './sha256/sha256.base64'; -export * from './sha512/sha512.base64'; +export * from './hashes.js'; +export * from './ripemd160/ripemd160.base64.js'; +export * from './secp256k1/secp256k1-wasm.js'; +export * from './sha1/sha1.base64.js'; +export * from './sha256/sha256.base64.js'; +export * from './sha512/sha512.base64.js'; diff --git a/src/lib/bin/hashes.ts b/src/lib/bin/hashes.ts index 64bba7cc..99fa8816 100644 --- a/src/lib/bin/hashes.ts +++ b/src/lib/bin/hashes.ts @@ -5,7 +5,7 @@ export interface HashFunction { readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; } -/* eslint-disable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ /** * Note, most of this method is translated and boiled-down from the wasm-pack * workflow. Significant changes to wasm-bindgen or wasm-pack build will likely @@ -19,7 +19,7 @@ export const instantiateRustWasm = async ( updateExportName: string, finalExportName: string ): Promise => { - const wasm = (( + const wasm = ( await WebAssembly.instantiate(webassemblyBytes, { [expectedImportModuleName]: { /** @@ -42,7 +42,7 @@ export const instantiateRustWasm = async ( }, }, }) - ).instance.exports as unknown) as any; // eslint-disable-line @typescript-eslint/no-explicit-any + ).instance.exports as unknown as any; // eslint-disable-line @typescript-eslint/no-explicit-any let cachedUint8Memory: Uint8Array | undefined; // eslint-disable-line @typescript-eslint/init-declarations let cachedUint32Memory: Uint32Array | undefined; // eslint-disable-line @typescript-eslint/init-declarations @@ -52,7 +52,8 @@ export const instantiateRustWasm = async ( if (cachedGlobalArgumentPtr === undefined) { cachedGlobalArgumentPtr = wasm.__wbindgen_global_argument_ptr(); } - return cachedGlobalArgumentPtr; + + return cachedGlobalArgumentPtr!; }; /** * Must be hoisted for `__wbindgen_throw`. @@ -63,6 +64,7 @@ export const instantiateRustWasm = async ( cachedUint8Memory === undefined || cachedUint8Memory.buffer !== wasm.memory.buffer ) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument cachedUint8Memory = new Uint8Array(wasm.memory.buffer); } return cachedUint8Memory; @@ -72,6 +74,7 @@ export const instantiateRustWasm = async ( cachedUint32Memory === undefined || cachedUint32Memory.buffer !== wasm.memory.buffer ) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument cachedUint32Memory = new Uint32Array(wasm.memory.buffer); } return cachedUint32Memory; @@ -92,8 +95,8 @@ export const instantiateRustWasm = async ( try { wasm[hashExportName](retPtr, ptr0, len0); const mem = getUint32Memory(); - const ptr = mem[(retPtr as number) / 4]; - const len = mem[(retPtr as number) / 4 + 1]; + const ptr = mem[retPtr / 4]!; + const len = mem[retPtr / 4 + 1]!; const realRet = getArrayU8FromWasm(ptr, len).slice(); wasm.__wbindgen_free(ptr, len); return realRet; @@ -106,22 +109,22 @@ export const instantiateRustWasm = async ( const retPtr = globalArgumentPtr(); wasm[initExportName](retPtr); const mem = getUint32Memory(); - const ptr = mem[(retPtr as number) / 4]; - const len = mem[(retPtr as number) / 4 + 1]; + const ptr = mem[retPtr / 4]!; + const len = mem[retPtr / 4 + 1]!; const realRet = getArrayU8FromWasm(ptr, len).slice(); wasm.__wbindgen_free(ptr, len); return realRet; }; const update = (rawState: Uint8Array, input: Uint8Array) => { - const [ptr0, len0] = passArray8ToWasm(rawState); + const [ptr0, len0] = passArray8ToWasm(rawState) as [number, number]; const [ptr1, len1] = passArray8ToWasm(input); const retPtr = globalArgumentPtr(); try { wasm[updateExportName](retPtr, ptr0, len0, ptr1, len1); const mem = getUint32Memory(); - const ptr = mem[(retPtr as number) / 4]; - const len = mem[(retPtr as number) / 4 + 1]; + const ptr = mem[retPtr / 4]!; + const len = mem[retPtr / 4 + 1]!; const realRet = getArrayU8FromWasm(ptr, len).slice(); wasm.__wbindgen_free(ptr, len); return realRet; @@ -133,13 +136,13 @@ export const instantiateRustWasm = async ( }; const final = (rawState: Uint8Array) => { - const [ptr0, len0] = passArray8ToWasm(rawState); + const [ptr0, len0] = passArray8ToWasm(rawState) as [number, number]; const retPtr = globalArgumentPtr(); try { wasm[finalExportName](retPtr, ptr0, len0); const mem = getUint32Memory(); - const ptr = mem[(retPtr as number) / 4]; - const len = mem[(retPtr as number) / 4 + 1]; + const ptr = mem[retPtr / 4]!; + const len = mem[retPtr / 4 + 1]!; const realRet = getArrayU8FromWasm(ptr, len).slice(); wasm.__wbindgen_free(ptr, len); return realRet; @@ -155,4 +158,4 @@ export const instantiateRustWasm = async ( update, }; }; -/* eslint-enable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ +/* eslint-enable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts index 8e9f10fd..283340a5 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts @@ -4,7 +4,7 @@ * bitflags used in secp256k1's public API (translated from secp256k1.h) */ -/* eslint-disable no-bitwise, @typescript-eslint/no-magic-numbers */ +/* eslint-disable no-bitwise, @typescript-eslint/no-magic-numbers, @typescript-eslint/prefer-literal-enum-member */ /** All flags' lower 8 bits indicate what they're for. Do not use directly. */ // const SECP256K1_FLAGS_TYPE_MASK = (1 << 8) - 1; const SECP256K1_FLAGS_TYPE_CONTEXT = 1 << 0; @@ -53,14 +53,10 @@ export enum CompressionFlag { COMPRESSED = SECP256K1_EC_COMPRESSED as 258, UNCOMPRESSED = SECP256K1_EC_UNCOMPRESSED as 2, } -/* eslint-enable no-bitwise, @typescript-eslint/no-magic-numbers */ +/* eslint-enable no-bitwise, @typescript-eslint/no-magic-numbers, @typescript-eslint/prefer-literal-enum-member */ /** - * An object which wraps the WebAssembly implementation of `libsecp256k1`. - * - * Because WebAssembly modules are dynamically-instantiated at runtime, this - * object must be created and awaited from `instantiateSecp256k1Wasm` or - * `instantiateSecp256k1WasmBytes`. + * An object that wraps the WebAssembly implementation of `libsecp256k1`. * * **It's very unlikely that consumers will need to use this interface directly. * See [[Secp256k1]] for a more purely-functional API.** @@ -86,14 +82,14 @@ export interface Secp256k1Wasm { * Returns 1 if the randomization was successfully updated, or 0 if not. * * While secp256k1 code is written to be constant-time no matter what secret - * values are, it's possible that a future compiler may output code which isn't, - * and also that the CPU may not emit the same radio frequencies or draw the same - * amount power for all values. + * values are, it's possible that a future compiler may output code that + * isn't, and also that the CPU may not emit the same radio frequencies or + * draw the same amount power for all values. * - * This function provides a seed which is combined into the blinding value: that - * blinding value is added before each multiplication (and removed afterwards) so - * that it does not affect function results, but shields against attacks which - * rely on any input-dependent behavior. + * This function provides a seed that is combined into the blinding value: + * that blinding value is added before each multiplication (and removed + * afterwards) so that it does not affect function results, but shields + * against attacks that rely on any input-dependent behavior. * * You should call this after `contextCreate` or * secp256k1_context_clone, and may call this repeatedly afterwards. @@ -101,7 +97,7 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param seedPtr - pointer to a 32-byte random seed */ - readonly contextRandomize: (contextPtr: number, seedPtr: number) => 1 | 0; + readonly contextRandomize: (contextPtr: number, seedPtr: number) => 0 | 1; /** * Frees a pointer allocated by the `malloc` method. @@ -109,7 +105,6 @@ export interface Secp256k1Wasm { */ readonly free: (pointer: number) => number; - // eslint-disable-next-line functional/no-mixed-type readonly heapU32: Uint32Array; readonly heapU8: Uint8Array; readonly instance: WebAssembly.Instance; @@ -118,7 +113,7 @@ export interface Secp256k1Wasm { * Allocates the given number of bytes in WebAssembly memory. * @param malloc - the number of bytes to allocate */ - // eslint-disable-next-line functional/no-mixed-type + readonly malloc: (bytes: number) => number; /** @@ -149,7 +144,7 @@ export interface Secp256k1Wasm { contextPtr: number, secretKeyPtr: number, tweakNum256Ptr: number - ) => 1 | 0; + ) => 0 | 1; /** * Tweak a _privateKey_ by multiplying _tweak_ to it. @@ -163,7 +158,7 @@ export interface Secp256k1Wasm { contextPtr: number, secretKeyPtr: number, tweakNum256Ptr: number - ) => 1 | 0; + ) => 0 | 1; /** * Compute the public key for a secret key. @@ -179,7 +174,7 @@ export interface Secp256k1Wasm { contextPtr: number, publicKeyPtr: number, secretKeyPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Parse a variable-length public key into the pubkey object. @@ -187,9 +182,9 @@ export interface Secp256k1Wasm { * Returns 1 if the public key was fully valid, or 0 if the public key could * not be parsed or is invalid. * - * This function supports parsing compressed (33 bytes, header byte 0x02 or - * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header - * byte 0x06 or 0x07) format public keys. + * This function supports parsing compressed (33 bytes, header byte 0x02 or + * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header + * byte 0x06 or 0x07) format public keys. * * @param contextPtr - pointer to a context object * @param publicKeyOutPtr - a pointer to a 64 byte space where the parsed public @@ -205,7 +200,7 @@ export interface Secp256k1Wasm { publicKeyInPtr: number, // eslint-disable-next-line @typescript-eslint/no-magic-numbers publicKeyInLength: 33 | 65 - ) => 1 | 0; + ) => 0 | 1; /** * Serialize a pubkey object into a serialized byte sequence. @@ -215,10 +210,11 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param outputPtr - pointer to a 65-byte (if uncompressed) or 33-byte (if * compressed) byte array in which to place the serialized key - * @param outputLengthPtr - pointer to an integer which is initially set to the + * @param outputLengthPtr - pointer to an integer that is initially set to the * size of output, and is overwritten with the written size * @param publicKeyPtr - pointer to a public key (parsed, internal format) - * @param compression - a CompressionFlag indicating compressed or uncompressed + * @param compression - a CompressionFlag indicating compressed + * or uncompressed */ readonly pubkeySerialize: ( contextPtr: number, @@ -242,7 +238,7 @@ export interface Secp256k1Wasm { contextPtr: number, publicKeyPtr: number, tweakNum256Ptr: number - ) => 1 | 0; + ) => 0 | 1; /** * Tweak a _publicKey_ by multiplying it by a _tweak_ value. @@ -258,7 +254,7 @@ export interface Secp256k1Wasm { contextPtr: number, publicKeyPtr: number, tweakNum256Ptr: number - ) => 1 | 0; + ) => 0 | 1; /** * Read from WebAssembly memory by creating a new Uint8Array beginning at @@ -293,7 +289,7 @@ export interface Secp256k1Wasm { publicKeyPtr: number, rSigPtr: number, msg32Ptr: number - ) => 1 | 0; + ) => 0 | 1; /** * Parse an ECDSA signature in compact (64 bytes) format with a recovery @@ -318,7 +314,7 @@ export interface Secp256k1Wasm { outputRSigPtr: number, inputSigPtr: number, rid: number - ) => 1 | 0; + ) => 0 | 1; /** * Serialize a recoverable ECDSA signature in compact (64 byte) format along @@ -329,7 +325,7 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param sigOutPtr - pointer to a 64-byte space to store the compact * serialization - * @param recIDOutPtr - pointer to an int which will store the recovery number + * @param recIDOutPtr - pointer to an int that will store the recovery number * @param rSigPtr - pointer to the 65-byte signature to be serialized * (internal format) */ @@ -368,7 +364,7 @@ export interface Secp256k1Wasm { outputSigPtr: number, msg32Ptr: number, secretKeyPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Verify a Secp256k1 EC-Schnorr-SHA256 signature (BCH construction). @@ -387,7 +383,7 @@ export interface Secp256k1Wasm { sigPtr: number, msg32Ptr: number, publicKeyPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Verify an ECDSA secret key. @@ -397,7 +393,7 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 1 | 0; + readonly seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 0 | 1; /** * Create an ECDSA signature. The created signature is always in lower-S form. @@ -421,13 +417,13 @@ export interface Secp256k1Wasm { outputSigPtr: number, msg32Ptr: number, secretKeyPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Malleate an ECDSA signature. * * This is done by negating the S value modulo the order of the curve, - * "flipping" the sign of the random point R which is not included in the + * "flipping" the sign of the random point R that is not included in the * signature. * * This method is added by Libauth to make testing of `signatureNormalize` @@ -491,7 +487,7 @@ export interface Secp256k1Wasm { contextPtr: number, outputSigPtr: number, inputSigPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Parse an ECDSA signature in compact (64 bytes) format. Returns 1 when the @@ -514,7 +510,7 @@ export interface Secp256k1Wasm { contextPtr: number, sigOutPtr: number, compactSigInPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Parse a DER ECDSA signature. @@ -541,12 +537,12 @@ export interface Secp256k1Wasm { sigOutPtr: number, sigDERInPtr: number, sigDERInLength: number - ) => 1 | 0; + ) => 0 | 1; /** * Serialize an ECDSA signature in compact (64 byte) format. Always returns 1. * - * See `signatureParseCompact` for details about the encoding. + * See {@link signatureParseCompact} for details about the encoding. * * @param contextPtr - pointer to a context object * @param outputCompactSigPtr - pointer to a 64-byte space to store the compact @@ -579,7 +575,7 @@ export interface Secp256k1Wasm { outputDERSigPtr: number, outputDERSigLengthPtr: number, inputSigPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Create a recoverable ECDSA signature. The created signature is always in @@ -604,7 +600,7 @@ export interface Secp256k1Wasm { outputRSigPtr: number, msg32Ptr: number, secretKeyPtr: number - ) => 1 | 0; + ) => 0 | 1; /** * Verify an ECDSA signature. @@ -632,5 +628,5 @@ export interface Secp256k1Wasm { sigPtr: number, msg32Ptr: number, pubkeyPtr: number - ) => 1 | 0; + ) => 0 | 1; } diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts index 3206a671..5373ddb8 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts @@ -1,18 +1,18 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import { randomBytes } from 'crypto'; import { readFileSync } from 'fs'; import { join } from 'path'; -import test, { ExecutionContext } from 'ava'; +import type { ExecutionContext } from 'ava'; +import test from 'ava'; +import type { Secp256k1Wasm } from '../../lib'; import { CompressionFlag, ContextFlag, getEmbeddedSecp256k1Binary, instantiateSecp256k1Wasm, instantiateSecp256k1WasmBytes, - Secp256k1Wasm, -} from '../../lib'; +} from '../../lib.js'; // test vectors from `zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong` (`xprv9s21ZrQH143K2PfMvkNViFc1fgumGqBew45JD8SxA59Jc5M66n3diqb92JjvaR61zT9P89Grys12kdtV4EFVo6tMwER7U2hcUmZ9VfMYPLC`), m/0 and m/1: @@ -263,8 +263,8 @@ const testSecp256k1Wasm = ( rawRSigPtr ); const compactRSig = secp256k1Wasm.readHeapU8(compactRSigPtr, 64); - // eslint-disable-next-line no-bitwise - const rID = secp256k1Wasm.heapU32[rIDPtr >> 2]; + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + const rID = secp256k1Wasm.heapU32[rIDPtr >> 2]!; t.deepEqual(compactRSig, sigCompact); t.is(rID, 1); @@ -319,9 +319,8 @@ const testSecp256k1Wasm = ( const privkeyTweakedAddPtr = secp256k1Wasm.malloc(32); const rawPubkeyDerivedTweakedAddPtr = secp256k1Wasm.malloc(64); const pubkeyDerivedTweakedAddCompressedPtr = secp256k1Wasm.malloc(33); - const pubkeyDerivedTweakedAddCompressedLengthPtr = secp256k1Wasm.mallocSizeT( - 33 - ); + const pubkeyDerivedTweakedAddCompressedLengthPtr = + secp256k1Wasm.mallocSizeT(33); const rawPubkeyTweakedAddPtr = secp256k1Wasm.malloc(64); const pubkeyTweakedAddCompressedPtr = secp256k1Wasm.malloc(33); const pubkeyTweakedAddCompressedLengthPtr = secp256k1Wasm.mallocSizeT(33); @@ -329,9 +328,8 @@ const testSecp256k1Wasm = ( const privkeyTweakedMulPtr = secp256k1Wasm.malloc(32); const rawPubkeyDerivedTweakedMulPtr = secp256k1Wasm.malloc(64); const pubkeyDerivedTweakedMulCompressedPtr = secp256k1Wasm.malloc(33); - const pubkeyDerivedTweakedMulCompressedLengthPtr = secp256k1Wasm.mallocSizeT( - 33 - ); + const pubkeyDerivedTweakedMulCompressedLengthPtr = + secp256k1Wasm.mallocSizeT(33); const rawPubkeyTweakedMulPtr = secp256k1Wasm.malloc(64); const pubkeyTweakedMulCompressedPtr = secp256k1Wasm.malloc(33); const pubkeyTweakedMulCompressedLengthPtr = secp256k1Wasm.mallocSizeT(33); @@ -494,7 +492,7 @@ const testSecp256k1Wasm = ( const binary = getEmbeddedSecp256k1Binary(); test('[crypto] getEmbeddedSecp256k1Binary returns the proper binary', (t) => { - const path = join(__dirname, 'secp256k1.wasm'); + const path = join(new URL('.', import.meta.url).pathname, 'secp256k1.wasm'); const binaryFromDisk = readFileSync(path).buffer; t.deepEqual(binary, binaryFromDisk); }); diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.ts b/src/lib/bin/secp256k1/secp256k1-wasm.ts index d61b26fe..081d2ff8 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.ts @@ -1,15 +1,13 @@ /* eslint-disable no-underscore-dangle, max-params, @typescript-eslint/naming-convention */ // cSpell:ignore memcpy, anyfunc -import { base64ToBin } from '../../format/format'; +import { base64ToBin } from '../../format/format.js'; -import { - CompressionFlag, - ContextFlag, - Secp256k1Wasm, -} from './secp256k1-wasm-types'; -import { secp256k1Base64Bytes } from './secp256k1.base64'; +import type { Secp256k1Wasm } from './secp256k1-wasm-types'; +import { CompressionFlag, ContextFlag } from './secp256k1-wasm-types.js'; +import { secp256k1Base64Bytes } from './secp256k1.base64.js'; -export { ContextFlag, CompressionFlag, Secp256k1Wasm }; +export type { Secp256k1Wasm }; +export { ContextFlag, CompressionFlag }; /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ const wrapSecp256k1Wasm = ( @@ -37,7 +35,7 @@ const wrapSecp256k1Wasm = ( return pointer; }, mallocUint8Array: (array) => { - const pointer = (instance.exports as any)._malloc(array.length); + const pointer = (instance.exports as any)._malloc(array.length) as number; // eslint-disable-next-line functional/no-expression-statement heapU8.set(array, pointer); return pointer; @@ -102,7 +100,8 @@ const wrapSecp256k1Wasm = ( readSizeT: (pointer) => { // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const pointerView32 = pointer >> 2; - return heapU32[pointerView32]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return heapU32[pointerView32]!; }, recover: (contextPtr, outputPubkeyPointer, rSigPtr, msg32Ptr) => (instance.exports as any)._secp256k1_ecdsa_recover( @@ -112,7 +111,9 @@ const wrapSecp256k1Wasm = ( msg32Ptr ), recoverableSignatureParse: (contextPtr, outputRSigPtr, inputSigPtr, rid) => - (instance.exports as any)._secp256k1_ecdsa_recoverable_signature_parse_compact( + ( + instance.exports as any + )._secp256k1_ecdsa_recoverable_signature_parse_compact( contextPtr, outputRSigPtr, inputSigPtr, @@ -124,7 +125,9 @@ const wrapSecp256k1Wasm = ( recIDOutPtr, rSigPtr ) => - (instance.exports as any)._secp256k1_ecdsa_recoverable_signature_serialize_compact( + ( + instance.exports as any + )._secp256k1_ecdsa_recoverable_signature_serialize_compact( contextPtr, sigOutPtr, recIDOutPtr, @@ -241,7 +244,7 @@ const alignMemory = (factor: number, size: number) => /** * The most performant way to instantiate secp256k1 functionality. To avoid - * using Node.js or DOM-specific APIs, you can use `instantiateSecp256k1`. + * using Node.js or DOM-specific APIs, you can use {@link instantiateSecp256k1}. * * Note, most of this method is translated and boiled-down from Emscripten's * preamble.js. Significant changes to the WASM build or breaking updates to @@ -352,8 +355,7 @@ export const instantiateSecp256k1WasmBytes = async ( return WebAssembly.instantiate(webassemblyBytes, info).then((result) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment - getErrNoLocation = result.instance.exports.___errno_location as any; - + getErrNoLocation = result.instance.exports['___errno_location'] as any; return wrapSecp256k1Wasm(result.instance, heapU8, heapU32); }); }; @@ -363,8 +365,9 @@ export const getEmbeddedSecp256k1Binary = () => base64ToBin(secp256k1Base64Bytes).buffer; /** - * An ultimately-portable (but slower) version of `instantiateSecp256k1Bytes` - * which does not require the consumer to provide the secp256k1 binary buffer. + * An ultimately-portable (but slower) version of + * {@link instantiateSecp256k1Bytes} that does not require the consumer to + * provide the secp256k1 binary buffer. */ export const instantiateSecp256k1Wasm = async (): Promise => instantiateSecp256k1WasmBytes(getEmbeddedSecp256k1Binary()); diff --git a/src/lib/template/compiler-bch/compiler-bch-operations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts similarity index 79% rename from src/lib/template/compiler-bch/compiler-bch-operations.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts index d32d482d..89544156 100644 --- a/src/lib/template/compiler-bch/compiler-bch-operations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts @@ -1,16 +1,13 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { - compilerOperationSigningSerializationFullBCH, - TransactionContextCommon, -} from '../../lib'; +import type { CompilationContextBCH } from '../../lib'; +import { compilerOperationSigningSerializationFullBCH } from '../../lib.js'; test('compilerOperationSigningSerializationFullBCH: requires an algorithm', (t) => { t.deepEqual( compilerOperationSigningSerializationFullBCH( '', - { transactionContext: {} as TransactionContextCommon }, + { compilationContext: {} as CompilationContextBCH }, { scripts: { lock: '' }, sha256: { hash: () => Uint8Array.of() }, @@ -29,7 +26,7 @@ test('compilerOperationSigningSerializationFullBCH: error on unknown algorithms' t.deepEqual( compilerOperationSigningSerializationFullBCH( 'signing_serialization.full_unknown_serialization', - { transactionContext: {} as TransactionContextCommon }, + { compilationContext: {} as CompilationContextBCH }, { scripts: { lock: '' }, sha256: { hash: () => Uint8Array.of() }, diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts similarity index 86% rename from src/lib/template/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts index 423b8fd0..ebbec6c5 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts @@ -1,28 +1,27 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - CompilationEnvironmentBCH, + CompilerConfigurationBCH, +} from '../../lib'; +import { + compilerConfigurationToCompilerBCH, compilerOperationsBCH, createAuthenticationProgramEvaluationCommon, - createCompiler, - createTransactionContextCommonTesting, + createCompilationContextCommonTesting, + createVirtualMachineBCH, dateToLocktime, generateBytecodeMap, hexToBin, - instantiateSha256, - instantiateVirtualMachineBCH, - instructionSetBCHCurrentStrict, - OpcodesBCH, - TransactionContextBCH, -} from '../../lib'; + OpcodesBCH2022, + sha256, +} from '../../lib.js'; import { expectCompilationResult, privkey, -} from './compiler-bch.e2e.spec.helper'; +} from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] built-in variables – current_block_time - error', @@ -95,9 +94,8 @@ test( expectCompilationResult, '', { - transactionContext: { - ...createTransactionContextCommonTesting(), - locktime: 500000000, + compilationContext: { + ...createCompilationContextCommonTesting({ locktime: 500000000 }), }, }, { @@ -125,9 +123,8 @@ test( expectCompilationResult, '', { - transactionContext: { - ...createTransactionContextCommonTesting(), - locktime: 0, + compilationContext: { + ...createCompilationContextCommonTesting({ locktime: 0 }), }, }, { @@ -155,9 +152,17 @@ test( expectCompilationResult, '', { - transactionContext: { - ...createTransactionContextCommonTesting(), - sequenceNumber: 0xffffffff, + compilationContext: { + ...createCompilationContextCommonTesting({ + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: Uint8Array.of(0), + sequenceNumber: 0xffffffff, + unlockingBytecode: undefined, + }, + ], + }), }, }, { @@ -165,7 +170,7 @@ test( errors: [ { error: - 'The script "test" requires a locktime, but this input\'s sequence number is set to disable transaction locktime (0xffffffff). This will cause the OP_CHECKLOCKTIMEVERIFY operation to error when the transaction is verified. To be valid, this input must use a sequence number which does not disable locktime.', + 'The script "test" requires a locktime, but this input\'s sequence number is set to disable transaction locktime (0xffffffff). This will cause the OP_CHECKLOCKTIMEVERIFY operation to error when the transaction is verified. To be valid, this input must use a sequence number that does not disable locktime.', range: { endColumn: 0, endLineNumber: 0, @@ -184,13 +189,13 @@ test( '[BCH compiler] built-in variables – signing_serialization.full_all_outputs - error', expectCompilationResult, '', - { transactionContext: undefined }, + { compilationContext: undefined }, { errorType: 'resolve', errors: [ { error: - 'Cannot resolve "signing_serialization.full_all_outputs" – the "transactionContext" property was not provided in the compilation data.', + 'Cannot resolve "signing_serialization.full_all_outputs" – the "compilationContext" property was not provided in the compilation data.', range: { endColumn: 40, endLineNumber: 1, @@ -207,7 +212,7 @@ test( '[BCH compiler] built-in variables – signing_serialization - no component or algorithm', expectCompilationResult, '', - { transactionContext: undefined }, + { compilationContext: undefined }, { errorType: 'resolve', errors: [ @@ -282,7 +287,7 @@ test( '[BCH compiler] built-in variables – signing_serialization - error', expectCompilationResult, '', - { transactionContext: undefined }, + { compilationContext: undefined }, { errorType: 'resolve', errors: [ @@ -301,7 +306,7 @@ test( } as BytecodeGenerationResult ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_all_outputs', expectCompilationResult, '', @@ -314,7 +319,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_all_outputs_single_input', expectCompilationResult, '', @@ -327,7 +332,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_corresponding_output', expectCompilationResult, '', @@ -340,7 +345,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_corresponding_output_single_input', expectCompilationResult, '', @@ -353,7 +358,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_no_outputs', expectCompilationResult, '', @@ -366,7 +371,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.full_no_outputs_single_input', expectCompilationResult, '', @@ -379,7 +384,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.corresponding_output', expectCompilationResult, '', @@ -390,7 +395,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.corresponding_output_hash', expectCompilationResult, '', @@ -447,7 +452,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.outpoint_transaction_hash', expectCompilationResult, '', @@ -460,7 +465,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.output_value', expectCompilationResult, '', @@ -482,7 +487,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_outpoints', expectCompilationResult, '', @@ -493,7 +498,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_outpoints_hash', expectCompilationResult, '', @@ -506,7 +511,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_outputs', expectCompilationResult, '', @@ -517,7 +522,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_outputs_hash', expectCompilationResult, '', @@ -530,7 +535,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_sequence_numbers', expectCompilationResult, '', @@ -541,7 +546,7 @@ test( } ); -test( +test.failing( '[BCH compiler] built-in variables – signing_serialization.transaction_sequence_numbers_hash', expectCompilationResult, '', @@ -575,7 +580,7 @@ test( errors: [ { error: - 'Identifier "signing_serialization.covered_bytecode" requires a signing serialization, but "coveredBytecode" cannot be determined because "test" is not present in the compilation environment "unlockingScripts".', + 'Identifier "signing_serialization.covered_bytecode" requires a signing serialization, but "coveredBytecode" cannot be determined because "test" is not present in the compiler configuration\'s "unlockingScripts".', range: { endColumn: 40, endLineNumber: 1, @@ -602,7 +607,7 @@ test( errors: [ { error: - 'Identifier "signing_serialization.covered_bytecode" requires a signing serialization which covers an unknown locking script, "some_unknown_script".', + 'Identifier "signing_serialization.covered_bytecode" requires a signing serialization that covers an unknown locking script, "some_unknown_script".', range: { endColumn: 40, endLineNumber: 1, @@ -697,54 +702,58 @@ test( } as BytecodeGenerationResult ); -const sha256Promise = instantiateSha256(); -const vmPromise = instantiateVirtualMachineBCH(instructionSetBCHCurrentStrict); -test('[BCH compiler] signing_serialization.corresponding_output and signing_serialization.corresponding_output_hash – returns empty bytecode if no corresponding output', async (t) => { - const sha256 = await sha256Promise; - const vm = await vmPromise; - const compiler = createCompiler< - TransactionContextBCH, - CompilationEnvironmentBCH, - OpcodesBCH, - AuthenticationProgramStateBCH - >({ - createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - opcodes: generateBytecodeMap(OpcodesBCH), - operations: compilerOperationsBCH, - scripts: { - // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention - corresponding_output: - '<1> <2>', - // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention - corresponding_output_hash: - '<1> <2>', - }, - sha256, - variables: { - a: { - type: 'Key', +test.failing( + '[BCH compiler] signing_serialization.corresponding_output and signing_serialization.corresponding_output_hash – returns empty bytecode if no corresponding output', + (t) => { + const compiler = compilerConfigurationToCompilerBCH< + CompilerConfigurationBCH, + AuthenticationProgramStateBCH + >({ + createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, + opcodes: generateBytecodeMap(OpcodesBCH2022), + operations: compilerOperationsBCH, + scripts: { + // eslint-disable-next-line camelcase + corresponding_output: + '<1> <2>', + // eslint-disable-next-line camelcase + corresponding_output_hash: + '<1> <2>', }, - }, - vm, - }); - - const data = { - keys: { privateKeys: { a: privkey } }, - transactionContext: { - ...createTransactionContextCommonTesting(), - ...{ - correspondingOutput: undefined, + sha256, + variables: { + a: { + type: 'Key', + }, }, - }, - }; + vm: createVirtualMachineBCH(), + }); - t.deepEqual(compiler.generateBytecode('corresponding_output', data), { - bytecode: hexToBin('510052'), - success: true, - }); + const data = { + compilationContext: { + ...createCompilationContextCommonTesting(), + inputIndex: 1, + }, + keys: { privateKeys: { a: privkey } }, + }; - t.deepEqual(compiler.generateBytecode('corresponding_output_hash', data), { - bytecode: hexToBin('510052'), - success: true, - }); -}); + t.deepEqual( + compiler.generateBytecode({ data, scriptId: 'corresponding_output' }), + { + bytecode: hexToBin('510052'), + success: true, + } + ); + + t.deepEqual( + compiler.generateBytecode({ + data, + scriptId: 'corresponding_output_hash', + }), + { + bytecode: hexToBin('510052'), + success: true, + } + ); + } +); diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts similarity index 95% rename from src/lib/template/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts index 9f2a451a..42cba776 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts @@ -1,17 +1,16 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/naming-convention */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; import { expectCompilationResult, hdPrivateKey, privkey, -} from './compiler-bch.e2e.spec.helper'; +} from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] data signatures – use a private key', @@ -155,7 +154,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.data_signature.another" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.data_signature.another" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 30, endLineNumber: 1, @@ -180,7 +179,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.data_signature.another" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.data_signature.another" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 30, endLineNumber: 1, @@ -205,7 +204,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.data_signature.another" – the "sha256" property was not provided in the compilation environment.', + 'Cannot resolve "owner.data_signature.another" – the "sha256" property was not provided in the compiler configuration.', range: { endColumn: 30, endLineNumber: 1, @@ -264,7 +263,7 @@ test( '[BCH compiler] data signatures – HD private key derivation error', expectCompilationResult, ' ', - { hdKeys: { addressIndex: 0, hdPrivateKeys: { ownerEntityId: 'xbad' } } }, + { hdKeys: { addressIndex: 0, hdPrivateKeys: { ownerEntityId: 'xBad' } } }, { errorType: 'resolve', errors: [ diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.evaluations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts similarity index 98% rename from src/lib/template/compiler-bch/compiler-bch.e2e.evaluations.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts index 6031446f..3a35a8a6 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.evaluations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts @@ -1,12 +1,11 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, } from '../../lib'; -import { expectCompilationResult } from './compiler-bch.e2e.spec.helper'; +import { expectCompilationResult } from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] evaluations – simple evaluation', @@ -19,7 +18,7 @@ test( } ); -test( +test.only( '[BCH compiler] evaluations – nested evaluations', expectCompilationResult, '$( $(<1> <2> OP_ADD) 0xaabbcc )', diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.hd-key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts similarity index 96% rename from src/lib/template/compiler-bch/compiler-bch.e2e.hd-key.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts index 3acd9963..19fa9e9e 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.hd-key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts @@ -1,17 +1,16 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/naming-convention */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; import { expectCompilationResult, hdPrivateKey, hdPublicKey, -} from './compiler-bch.e2e.spec.helper'; +} from './compiler-bch.e2e.spec.helper.js'; /** * `m/0` public key push @@ -45,7 +44,7 @@ const m1PublicPush = hexToBin( '21034002efc4f44014b116a986faa63b741b0b894a45ccf3f30c671e4146fb1c1954' ); -test( +test.failing( '[BCH compiler] HdKey – ECDSA: use an HD private key, addressIndex (`0`)', expectCompilationResult, '', @@ -61,7 +60,7 @@ test( { owner: { type: 'HdKey' } } ); -test( +test.failing( '[BCH compiler] HdKey – schnorr: use a private key', expectCompilationResult, '', @@ -169,7 +168,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.public_key" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.public_key" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 18, endLineNumber: 1, @@ -408,7 +407,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.signature.all_outputs" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.signature.all_outputs" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -435,7 +434,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 37, endLineNumber: 1, @@ -462,7 +461,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.signature.all_outputs" – the "sha256" property was not provided in the compilation environment.', + 'Cannot resolve "owner.signature.all_outputs" – the "sha256" property was not provided in the compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -489,7 +488,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "sha256" property was not provided in the compilation environment.', + 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "sha256" property was not provided in the compiler configuration.', range: { endColumn: 37, endLineNumber: 1, @@ -555,7 +554,12 @@ test( '[BCH compiler] HdKey – invalid HD private key', expectCompilationResult, '', - { hdKeys: { addressIndex: 2, hdPrivateKeys: { ownerEntityId: 'xbad' } } }, + { + hdKeys: { + addressIndex: 2, + hdPrivateKeys: { ownerEntityId: 'xprivkey1bad' }, + }, + }, { errorType: 'resolve', errors: [ @@ -650,7 +654,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.signature.all_outputs" – the "entityOwnership" property was not provided in the compilation environment.', + 'Cannot resolve "owner.signature.all_outputs" – the "entityOwnership" property was not provided in the compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -681,7 +685,7 @@ test( errors: [ { error: - 'Identifier "owner.signature.all_outputs" refers to an HdKey, but the "entityOwnership" for "owner" is not available in this compilation environment.', + 'Identifier "owner.signature.all_outputs" refers to an HdKey, but the "entityOwnership" for "owner" is not available in this compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -708,7 +712,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.public_key" – the "entityOwnership" property was not provided in the compilation environment.', + 'Cannot resolve "owner.public_key" – the "entityOwnership" property was not provided in the compiler configuration.', range: { endColumn: 18, endLineNumber: 1, @@ -735,7 +739,7 @@ test( errors: [ { error: - 'Identifier "owner.public_key" refers to an HdKey, but the "entityOwnership" for "owner" is not available in this compilation environment.', + 'Identifier "owner.public_key" refers to an HdKey, but the "entityOwnership" for "owner" is not available in this compiler configuration.', range: { endColumn: 18, endLineNumber: 1, @@ -780,7 +784,12 @@ test( '[BCH compiler] HdKey – invalid HD public key', expectCompilationResult, '', - { hdKeys: { addressIndex: 2, hdPublicKeys: { ownerEntityId: 'xbad' } } }, + { + hdKeys: { + addressIndex: 2, + hdPublicKeys: { ownerEntityId: 'xprivkey1bad' }, + }, + }, { errorType: 'resolve', errors: [ diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts similarity index 95% rename from src/lib/template/compiler-bch/compiler-bch.e2e.key.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts index aead08eb..acb624eb 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts @@ -1,18 +1,17 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/naming-convention */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; import { expectCompilationResult, privkey, -} from './compiler-bch.e2e.spec.helper'; +} from './compiler-bch.e2e.spec.helper.js'; -test( +test.failing( '[BCH compiler] Key – ECDSA: use a private key', expectCompilationResult, '', @@ -28,7 +27,7 @@ test( } ); -test( +test.failing( '[BCH compiler] Key – schnorr: use a private key', expectCompilationResult, '', @@ -70,7 +69,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.public_key" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.public_key" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 18, endLineNumber: 1, @@ -385,7 +384,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.signature.all_outputs" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.signature.all_outputs" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -412,7 +411,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "secp256k1" property was not provided in the compilation environment.', + 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "secp256k1" property was not provided in the compiler configuration.', range: { endColumn: 37, endLineNumber: 1, @@ -439,7 +438,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.signature.all_outputs" – the "sha256" property was not provided in the compilation environment.', + 'Cannot resolve "owner.signature.all_outputs" – the "sha256" property was not provided in the compiler configuration.', range: { endColumn: 29, endLineNumber: 1, @@ -466,7 +465,7 @@ test( errors: [ { error: - 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "sha256" property was not provided in the compilation environment.', + 'Cannot resolve "owner.schnorr_signature.all_outputs" – the "sha256" property was not provided in the compiler configuration.', range: { endColumn: 37, endLineNumber: 1, diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.langauge.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts similarity index 95% rename from src/lib/template/compiler-bch/compiler-bch.e2e.langauge.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts index 2d09ddba..6d4cca6a 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.langauge.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts @@ -1,13 +1,12 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; -import { expectCompilationResult } from './compiler-bch.e2e.spec.helper'; +import { expectCompilationResult } from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] language – empty script', @@ -18,7 +17,7 @@ test( ); test( - '[BCH compiler] language – compile BigIntLiterals to script numbers', + '[BCH compiler] language – compile BigIntLiterals to VM numbers', expectCompilationResult, '42 -42 2_147_483_647 -2_147_483_647', {}, @@ -26,7 +25,7 @@ test( ); test( - '[BCH compiler] language – compile BinaryLiterals to script numbers', + '[BCH compiler] language – compile BinaryLiterals to VM numbers', expectCompilationResult, '0b1 0b1111_1111 0b111 0b1111_1111__1111_1111__1111_1111__1111_1111____1111_1111__1111_1111__1111_1111__1111_1111_1', {}, diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.p2sh.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts similarity index 83% rename from src/lib/template/compiler-bch/compiler-bch.e2e.p2sh.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts index 2e5865d1..cd38163c 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.p2sh.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts @@ -1,13 +1,12 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; -import { expectCompilationResult } from './compiler-bch.e2e.spec.helper'; +import { expectCompilationResult } from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] transformation – unlocking script – standard locking type', @@ -34,7 +33,7 @@ test( ); test( - '[BCH compiler] transformation – unlocking script – p2sh locking type', + '[BCH compiler] transformation – unlocking script – p2sh20 locking type', expectCompilationResult, '', {}, @@ -45,7 +44,7 @@ test( {}, { lockingScriptTypes: { - lock: 'p2sh', + lock: 'p2sh20', }, scripts: { lock: 'OP_DROP OP_1', @@ -82,7 +81,7 @@ test( ); test( - '[BCH compiler] transformation – locking script – p2sh locking type', + '[BCH compiler] transformation – locking script – p2sh20 locking type', expectCompilationResult, '', {}, @@ -93,7 +92,7 @@ test( {}, { lockingScriptTypes: { - test: 'p2sh', + test: 'p2sh20', }, scripts: { test: 'OP_DROP OP_1', @@ -106,7 +105,7 @@ test( ); test( - '[BCH compiler] transformation – unlocking script – p2sh locking type - failed locking bytecode compilation', + '[BCH compiler] transformation – unlocking script – p2sh20 locking type - failed locking bytecode compilation', expectCompilationResult, '', {}, @@ -128,7 +127,7 @@ test( {}, { lockingScriptTypes: { - lock: 'p2sh', + lock: 'p2sh20', }, scripts: { lock: 'OP_DROP OP_1 unknown', @@ -141,7 +140,7 @@ test( ); test( - '[BCH compiler] transformation – locking script – p2sh locking type - failed raw compilation', + '[BCH compiler] transformation – locking script – p2sh20 locking type - failed raw compilation', expectCompilationResult, 'unknown', {}, @@ -163,13 +162,13 @@ test( {}, { lockingScriptTypes: { - test: 'p2sh', + test: 'p2sh20', }, } ); test( - '[BCH compiler] transformation – locking script – p2sh locking type - failed hash160 (bad vm)', + '[BCH compiler] transformation – locking script – p2sh20 locking type - failed hash160 (bad vm)', expectCompilationResult, '', {}, @@ -192,7 +191,7 @@ test( {}, { lockingScriptTypes: { - test: 'p2sh', + test: 'p2sh20', }, scripts: { test: 'OP_DROP OP_1', diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts similarity index 64% rename from src/lib/template/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts index 8a0082d3..b5a2815c 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts @@ -1,219 +1,203 @@ -/* eslint-disable functional/no-expression-statement */ -import test, { Macro } from 'ava'; +import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - CompilationEnvironmentBCH, + CompilerConfigurationBCH, +} from '../../lib'; +import { + compilerConfigurationToCompilerBCH, compilerOperationsBCH, createAuthenticationProgramEvaluationCommon, - createCompiler, - createTransactionContextCommonTesting, + createCompilationContextCommonTesting, + createVirtualMachineBCH, generateBytecodeMap, hexToBin, - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha256, - instantiateSha512, - instantiateVirtualMachineBCH, - instructionSetBCHCurrentStrict, - OpcodesBCH, + OpcodesBCH2022, + ripemd160, + secp256k1, + sha256, + sha512, stringify, - TransactionContextBCH, -} from '../../lib'; +} from '../../lib.js'; -import { hdPrivateKey, privkey } from './compiler-bch.e2e.spec.helper'; +import { hdPrivateKey, privkey } from './compiler-bch.e2e.spec.helper.js'; -const ripemd160Promise = instantiateRipemd160(); -const sha256Promise = instantiateSha256(); -const sha512Promise = instantiateSha512(); -const secp256k1Promise = instantiateSecp256k1(); -const vmPromise = instantiateVirtualMachineBCH(instructionSetBCHCurrentStrict); +const vm = createVirtualMachineBCH(); /** * Uses `createCompiler` rather than `createCompilerBCH` for performance. */ -const testSigningSerializationAlgorithms: Macro<[string, string]> = async ( - t, - unlockScript, - bytecodeHex -) => { - const ripemd160 = await ripemd160Promise; - const sha256 = await sha256Promise; - const sha512 = await sha512Promise; - const secp256k1 = await secp256k1Promise; - const vm = await vmPromise; - - const compiler = createCompiler< - TransactionContextBCH, - CompilationEnvironmentBCH, - OpcodesBCH, - AuthenticationProgramStateBCH - >({ - createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - entityOwnership: { - b: 'entity', - }, - opcodes: generateBytecodeMap(OpcodesBCH), - operations: compilerOperationsBCH, - ripemd160, - scripts: { - lock: - 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', - lockHd: - 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', - unlock: unlockScript, - unlockHd: unlockScript.replace(/a\./gu, 'b.'), - }, - secp256k1, - sha256, - sha512, - unlockingScripts: { - unlock: 'lock', - unlockHd: 'lockHd', - }, - variables: { - a: { - type: 'Key', +const testSigningSerializationAlgorithms = test.macro<[string, string]>( + (t, unlockScript, bytecodeHex) => { + const compiler = compilerConfigurationToCompilerBCH< + CompilerConfigurationBCH, + AuthenticationProgramStateBCH + >({ + createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, + entityOwnership: { + b: 'entity', }, - b: { - privateDerivationPath: 'm/i', - type: 'HdKey', + opcodes: generateBytecodeMap(OpcodesBCH2022), + operations: compilerOperationsBCH, + ripemd160, + scripts: { + lock: 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + lockHd: + 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + unlock: unlockScript, + unlockHd: unlockScript.replace(/a\./gu, 'b.'), }, - }, - vm, - }); + secp256k1, + sha256, + sha512, + unlockingScripts: { + unlock: 'lock', + unlockHd: 'lockHd', + }, + variables: { + a: { + type: 'Key', + }, + b: { + privateDerivationPath: 'm/i', + type: 'HdKey', + }, + }, + vm, + }); - const resultUnlock = compiler.generateBytecode('unlock', { - keys: { privateKeys: { a: privkey } }, - transactionContext: createTransactionContextCommonTesting(), - }); - t.deepEqual( - resultUnlock, - { - bytecode: hexToBin(bytecodeHex), - success: true, - }, - `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlock - )}` - ); - const resultUnlockHd = compiler.generateBytecode('unlockHd', { - hdKeys: { addressIndex: 0, hdPrivateKeys: { entity: hdPrivateKey } }, - transactionContext: createTransactionContextCommonTesting(), - }); - t.deepEqual( - resultUnlockHd, - { - bytecode: hexToBin(bytecodeHex), - success: true, - }, - `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlockHd - )}` - ); -}; + const resultUnlock = compiler.generateBytecode({ + data: { + compilationContext: createCompilationContextCommonTesting(), + keys: { privateKeys: { a: privkey } }, + }, + scriptId: 'unlock', + }); + t.deepEqual( + resultUnlock, + { + bytecode: hexToBin(bytecodeHex), + success: true, + }, + `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( + resultUnlock + )}` + ); + const resultUnlockHd = compiler.generateBytecode({ + data: { + compilationContext: createCompilationContextCommonTesting(), + hdKeys: { addressIndex: 0, hdPrivateKeys: { entity: hdPrivateKey } }, + }, + scriptId: 'unlockHd', + }); + t.deepEqual( + resultUnlockHd, + { + bytecode: hexToBin(bytecodeHex), + success: true, + }, + `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( + resultUnlockHd + )}` + ); + } +); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA all_outputs', testSigningSerializationAlgorithms, ' ', '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA all_outputs_single_input', testSigningSerializationAlgorithms, ' ', '483045022100b30fb165fa511b6ff3718a4dcc6dd25dd916620e08e207c47a54bae56a3dbd5402202cf24193d51a9cd11be879eb1da063ad22ac30b355855e5c8147bf1e5f2e2cf1c1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA corresponding_output', testSigningSerializationAlgorithms, ' ', '483045022100cea4e9fe270b4337c3c0cffdf57b2ccba11245752a860f9ff5c06cd3bfa399d902203ebef34068efe7e9bd2a334f886bc720e975fd4485df9d8b8e0b98e671c1d02243210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', '473044022075bdb3381383221ea3073b2cc806b9f63ce0f1c1c5276f72a7b58922df2e69e40220075ec2497b9fa291ab028eed556fdc3591d93c52da80a35410731de40de8a0a6c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA no_outputs', testSigningSerializationAlgorithms, ' ', '47304402206e41f758eb74d0b679a5747c50a3e0c361dee4249ccc82ee491c862455a973e802204056bc00f207a7fb8ef3e2e068c09ca0d71f70685c66af7231a2aa0fb3e335f242210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – ECDSA no_outputs_single_input', testSigningSerializationAlgorithms, ' ', '483045022100bf73fa9557d725441b35af93ba2ae49e3afe3bd93cbddf9555e179fcc0b52d6f02203d7fb85de9ba6347ac87fe400819455c3a9f1a5c310f4e2dd32c00ae353a1981c2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr all_outputs', testSigningSerializationAlgorithms, ' ', '419adccdbb9b0242938a08900238e302c446dcde0415cc3252c2371da1f827090171ed051c9c121030c37caacc81217b979de766b69d04f64c67219c8ebc45fd2541210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr all_outputs_single_input', testSigningSerializationAlgorithms, ' ', '41a8ffa79bd74f44780b6679cbc177735691d85ea86129909b4943e1541594babafab8433943b71de881d8ac6114da4c6095528d93b77cc570a61102ec6352b2ffc1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr corresponding_output', testSigningSerializationAlgorithms, ' ', '4157130313297ff18f71e123522f6e673258aad57b02bc963350fb59490cde160ebb9da2cdef624d6efa447a297a4d46e56b0035012de361b9902565231782aa8f43210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', '41476031c21a9fe94b33135f7e7107a532de49956b0abf16a3bd941dad494b5e507274d50d2f2a67d30d2d26b76465be5bcc42a13b61d16e44068c3d1d905ac628c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr no_outputs', testSigningSerializationAlgorithms, ' ', '41c3e465fa4b26870a817aeb29ebce6d697fa76c39454b9bd7d85875ca2a742e47660ce169087d0ac90b7ff35b7854efa1dcfe85fcf5080f6754d69585ab45875f42210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test( +test.failing( '[BCH compiler] signing serialization algorithms – Schnorr no_outputs_single_input', testSigningSerializationAlgorithms, ' ', '413c24af0348f4eedba198f146fcfd3a099f67d4b17e690321bd038a3fd0ff8340200ab71722d2dd7fa3a513902c04362ff5ea41e4a7548e7733b377678bddcceac2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ); -test('[BCH compiler] signing serialization algorithms – no signing serialization data', async (t) => { - const sha256 = await sha256Promise; - const secp256k1 = await secp256k1Promise; - const vm = await vmPromise; - const compiler = createCompiler< - TransactionContextBCH, - CompilationEnvironmentBCH, - OpcodesBCH, +test('[BCH compiler] signing serialization algorithms – no signing serialization data', (t) => { + const compiler = compilerConfigurationToCompilerBCH< + CompilerConfigurationBCH, AuthenticationProgramStateBCH >({ createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - opcodes: generateBytecodeMap(OpcodesBCH), + opcodes: generateBytecodeMap(OpcodesBCH2022), operations: compilerOperationsBCH, scripts: { - lock: - 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + lock: 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', unlock: ' ', }, secp256k1, @@ -229,16 +213,19 @@ test('[BCH compiler] signing serialization algorithms – no signing serializati vm, }); - const resultUnlock = compiler.generateBytecode('unlock', { - keys: { privateKeys: { a: privkey } }, - transactionContext: undefined, + const resultUnlock = compiler.generateBytecode({ + data: { + compilationContext: undefined, + keys: { privateKeys: { a: privkey } }, + }, + scriptId: 'unlock', }); t.deepEqual(resultUnlock, { errorType: 'resolve', errors: [ { error: - 'Cannot resolve "a.schnorr_signature.all_outputs" – the "transactionContext" property was not provided in the compilation data.', + 'Cannot resolve "a.schnorr_signature.all_outputs" – the "compilationContext" property was not provided in the compilation data.', range: { endColumn: 33, endLineNumber: 1, diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts new file mode 100644 index 00000000..0cc562d2 --- /dev/null +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts @@ -0,0 +1,112 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ +import test from 'ava'; + +import type { + AuthenticationProgramStateBCH, + BytecodeGenerationResult, + CompilationContextBCH, + CompilationData, + CompilerConfiguration, + CompilerConfigurationBCH, +} from '../../lib'; +import { + compilerConfigurationToCompilerBCH, + compilerOperationsBCH, + createAuthenticationProgramEvaluationCommon, + createCompilationContextCommonTesting, + createVirtualMachineBCH, + generateBytecodeMap, + OpcodesBCH2022, + ripemd160, + secp256k1, + sha256, + sha512, + stringifyTestVector, +} from '../../lib.js'; + +/** + * `m` + */ +export const hdPrivateKey = + 'xprv9s21ZrQH143K2PfMvkNViFc1fgumGqBew45JD8SxA59Jc5M66n3diqb92JjvaR61zT9P89Grys12kdtV4EFVo6tMwER7U2hcUmZ9VfMYPLC'; +/** + * `m` + */ +export const hdPublicKey = + 'xpub661MyMwAqRbcEsjq2muW5PYkDikFgHuWJGzu1WrZiQgHUsgEeKMtGducsZe1iRsGAGNGDzmWYDM69ya24LMyR7mDhtzqQsc286XEQfM2kkV'; + +/** + * `m/0` + */ +// prettier-ignore +export const privkey = new Uint8Array([0xf8, 0x5d, 0x4b, 0xd8, 0xa0, 0x3c, 0xa1, 0x06, 0xc9, 0xde, 0xb4, 0x7b, 0x79, 0x18, 0x03, 0xda, 0xc7, 0xf0, 0x33, 0x38, 0x09, 0xe3, 0xf1, 0xdd, 0x04, 0xd1, 0x82, 0xe0, 0xab, 0xa6, 0xe5, 0x53]); + +const vm = createVirtualMachineBCH(); + +/** + * Uses `createCompiler` rather than `createCompilerBCH` for performance. + */ +export const expectCompilationResult = test.macro< + [ + string, + CompilationData, + BytecodeGenerationResult, + CompilerConfiguration['variables']?, + Partial>? + ] +>( + ( + t, + testScript, + otherData, + expectedResult, + variables, + configurationOverrides + // eslint-disable-next-line max-params + ) => { + const compiler = compilerConfigurationToCompilerBCH< + CompilerConfigurationBCH, + AuthenticationProgramStateBCH + >({ + createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, + entityOwnership: { + one: 'ownerEntityOne', + owner: 'ownerEntityId', + two: 'ownerEntityTwo', + }, + opcodes: generateBytecodeMap(OpcodesBCH2022), + operations: compilerOperationsBCH, + ripemd160, + scripts: { + another: '0xabcdef', + broken: 'does_not_exist', + lock: '', + test: testScript, + }, + secp256k1, + sha256, + sha512, + unlockingScripts: { + test: 'lock', + }, + variables, + vm, + ...configurationOverrides, + }); + + const resultUnlock = compiler.generateBytecode({ + data: { + compilationContext: createCompilationContextCommonTesting(), + ...otherData, + }, + scriptId: 'test', + }); + return t.deepEqual( + resultUnlock, + expectedResult, + `– \nResult: ${stringifyTestVector( + resultUnlock + )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + ); + } +); diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts similarity index 98% rename from src/lib/template/compiler-bch/compiler-bch.e2e.variables.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts index 7e08af87..329b8ff3 100644 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts @@ -1,13 +1,12 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; -import { +import type { AuthenticationProgramStateBCH, BytecodeGenerationResult, - hexToBin, } from '../../lib'; +import { hexToBin } from '../../lib.js'; -import { expectCompilationResult } from './compiler-bch.e2e.spec.helper'; +import { expectCompilationResult } from './compiler-bch.e2e.spec.helper.js'; test( '[BCH compiler] variables – AddressData', diff --git a/src/lib/template/compiler-bch/compiler-bch.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts similarity index 82% rename from src/lib/template/compiler-bch/compiler-bch.spec.ts rename to src/lib/compiler/compiler-bch/compiler-bch.spec.ts index f99468a4..1bfb3e05 100644 --- a/src/lib/template/compiler-bch/compiler-bch.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts @@ -1,25 +1,24 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; -import { - AuthenticationErrorBCH, +import type { AuthenticationInstruction, + AuthenticationProgramBCH, +} from '../../lib'; +import { createAuthenticationProgramStateCommon, + createCompilationContextCommonTesting, createCompilerBCH, - createTransactionContextCommonTesting, hexToBin, - OpcodesBCH, stringifyTestVector, -} from '../../lib'; +} from '../../lib.js'; // prettier-ignore const privkey = new Uint8Array([0xf8, 0x5d, 0x4b, 0xd8, 0xa0, 0x3c, 0xa1, 0x06, 0xc9, 0xde, 0xb4, 0x7b, 0x79, 0x18, 0x03, 0xda, 0xc7, 0xf0, 0x33, 0x38, 0x09, 0xe3, 0xf1, 0xdd, 0x04, 0xd1, 0x82, 0xe0, 0xab, 0xa6, 0xe5, 0x53]); -test('[BCH compiler] createCompilerBCH: generateBytecode', async (t) => { - const compiler = await createCompilerBCH({ +test.failing('[BCH compiler] createCompilerBCH: generateBytecode', (t) => { + const compiler = createCompilerBCH({ scripts: { - lock: - 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + lock: 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', unlock: ' ', }, unlockingScripts: { @@ -31,8 +30,11 @@ test('[BCH compiler] createCompilerBCH: generateBytecode', async (t) => { }, }, }); - const resultLock = compiler.generateBytecode('lock', { - keys: { privateKeys: { a: privkey } }, + const resultLock = compiler.generateBytecode({ + data: { + keys: { privateKeys: { a: privkey } }, + }, + scriptId: 'lock', }); t.deepEqual( resultLock, @@ -43,9 +45,12 @@ test('[BCH compiler] createCompilerBCH: generateBytecode', async (t) => { stringifyTestVector(resultLock) ); - const resultUnlock = compiler.generateBytecode('unlock', { - keys: { privateKeys: { a: privkey } }, - transactionContext: createTransactionContextCommonTesting(), + const resultUnlock = compiler.generateBytecode({ + data: { + compilationContext: createCompilationContextCommonTesting(), + keys: { privateKeys: { a: privkey } }, + }, + scriptId: 'unlock', }); t.deepEqual( resultUnlock, @@ -59,19 +64,27 @@ test('[BCH compiler] createCompilerBCH: generateBytecode', async (t) => { ); }); -test('[BCH compiler] createCompilerBCH: debug', async (t) => { - const state = createTransactionContextCommonTesting(); - const createState = (instructions: AuthenticationInstruction[]) => - createAuthenticationProgramStateCommon({ +test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { + const program = createCompilationContextCommonTesting({ + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: Uint8Array.of(1), + sequenceNumber: 0, + unlockingBytecode: Uint8Array.of(), + }, + ], + }) as AuthenticationProgramBCH; + const createState = (instructions: AuthenticationInstruction[]) => + createAuthenticationProgramStateCommon({ instructions, + program, stack: [], - transactionContext: state, }); - const compiler = await createCompilerBCH({ + const compiler = createCompilerBCH({ createState, scripts: { - lock: - 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + lock: 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', unlock: ' ', }, unlockingScripts: { @@ -83,13 +96,13 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { }, }, }); - const resultLock = compiler.generateBytecode( - 'lock', - { + const resultLock = compiler.generateBytecode({ + data: { keys: { privateKeys: { a: privkey } }, }, - true - ); + debug: true, + scriptId: 'lock', + }); t.deepEqual( resultLock, { @@ -388,33 +401,19 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { trace: [ { alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], + controlStack: [], instructions: [], ip: 0, lastCodeSeparator: -1, - locktime: 0, operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, + program, signatureOperationsCount: 0, signedMessages: [], stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, }, { alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], + controlStack: [], instructions: [ { data: hexToBin( @@ -428,28 +427,15 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { ], ip: 0, lastCodeSeparator: -1, - locktime: 0, operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, + program, signatureOperationsCount: 0, signedMessages: [], stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, }, { alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], + controlStack: [], instructions: [ { data: hexToBin( @@ -463,14 +449,8 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { ], ip: 1, lastCodeSeparator: -1, - locktime: 0, operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, + program, signatureOperationsCount: 0, signedMessages: [], stack: [ @@ -478,17 +458,10 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' ), ], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, }, { alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], + controlStack: [], instructions: [ { data: hexToBin( @@ -502,30 +475,17 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { ], ip: 2, lastCodeSeparator: -1, - locktime: 0, operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, + program, signatureOperationsCount: 0, signedMessages: [], stack: [ hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'), ], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, }, { alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], + controlStack: [], instructions: [ { data: hexToBin( @@ -539,25 +499,13 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { ], ip: 2, lastCodeSeparator: -1, - locktime: 0, operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, + program, signatureOperationsCount: 0, signedMessages: [], stack: [ hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'), ], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, }, ], }, @@ -698,14 +646,14 @@ test('[BCH compiler] createCompilerBCH: debug', async (t) => { stringifyTestVector(resultLock) ); - const resultUnlock = compiler.generateBytecode( - 'unlock', - { + const resultUnlock = compiler.generateBytecode({ + data: { + compilationContext: createCompilationContextCommonTesting(), keys: { privateKeys: { a: privkey } }, - transactionContext: createTransactionContextCommonTesting(), }, - true - ); + debug: true, + scriptId: 'unlock', + }); t.deepEqual( resultUnlock, { diff --git a/src/lib/template/compiler-bch/compiler-bch.ts b/src/lib/compiler/compiler-bch/compiler-bch.ts similarity index 65% rename from src/lib/template/compiler-bch/compiler-bch.ts rename to src/lib/compiler/compiler-bch/compiler-bch.ts index 8c52d0f4..84e1553f 100644 --- a/src/lib/template/compiler-bch/compiler-bch.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.ts @@ -1,30 +1,27 @@ import { - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha1, - instantiateSha256, - instantiateSha512, + ripemd160 as internalRipemd160, + secp256k1 as internalSecp256k1, + sha256 as internalSha256, + sha512 as internalSha512, +} from '../../crypto/default-crypto-instances.js'; +import type { + AnyCompilerConfiguration, + AuthenticationProgramStateBCH, + AuthenticationTemplate, + CompilationContextBCH, + CompilationData, + CompilerConfiguration, + CompilerOperationResult, Sha256, -} from '../../crypto/crypto'; -import { TransactionContextCommon } from '../../transaction/transaction-types'; +} from '../../lib'; import { - generateSigningSerializationBCH, - SigningSerializationFlag, -} from '../../vm/instruction-sets/common/signing-serialization'; -import { - AuthenticationProgramStateBCH, + createAuthenticationVirtualMachine, createInstructionSetBCH, generateBytecodeMap, - getFlagsForInstructionSetBCH, - instructionSetBCHCurrentStrict, - OpcodesBCH, -} from '../../vm/instruction-sets/instruction-sets'; -import { createAuthenticationVirtualMachine } from '../../vm/virtual-machine'; -import { - authenticationTemplateToCompilationEnvironment, - createAuthenticationProgramEvaluationCommon, - createCompiler, -} from '../compiler'; + generateSigningSerializationBCH, + OpcodesBCH2022, + SigningSerializationFlag, +} from '../../vm/vm.js'; import { attemptCompilerOperations, compilerOperationAttemptBytecodeResolution, @@ -32,15 +29,13 @@ import { compilerOperationHelperDeriveHdKeyPrivate, compilerOperationHelperGenerateCoveredBytecode, compilerOperationRequires, -} from '../compiler-operation-helpers'; -import { compilerOperationsCommon } from '../compiler-operations'; +} from '../compiler-operation-helpers.js'; +import { compilerOperationsCommon } from '../compiler-operations.js'; import { - AnyCompilationEnvironment, - CompilationData, - CompilationEnvironment, - CompilerOperationResult, -} from '../compiler-types'; -import { AuthenticationTemplate } from '../template-types'; + authenticationTemplateToCompilerConfiguration, + compilerConfigurationToCompilerBCH, + createAuthenticationProgramEvaluationCommon, +} from '../compiler-utils.js'; export type CompilerOperationsKeyBCH = | 'data_signature' @@ -127,7 +122,7 @@ const getSigningSerializationType = ( export const compilerOperationHelperComputeSignatureBCH = ({ coveredBytecode, identifier, - transactionContext, + compilationContext, operationName, privateKey, sha256, @@ -136,9 +131,12 @@ export const compilerOperationHelperComputeSignatureBCH = ({ coveredBytecode: Uint8Array; identifier: string; privateKey: Uint8Array; - transactionContext: TransactionContextCommon; + compilationContext: CompilationContextBCH; operationName: string; - sign: (privateKey: Uint8Array, messageHash: Uint8Array) => Uint8Array; + sign: ( + privateKey: Uint8Array, + messageHash: Uint8Array + ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { const [, , algorithm, unknown] = identifier.split('.') as ( @@ -166,25 +164,14 @@ export const compilerOperationHelperComputeSignatureBCH = ({ status: 'error', }; } - - const serialization = generateSigningSerializationBCH({ - correspondingOutput: transactionContext.correspondingOutput, - coveredBytecode, - locktime: transactionContext.locktime, - outpointIndex: transactionContext.outpointIndex, - outpointTransactionHash: transactionContext.outpointTransactionHash, - outputValue: transactionContext.outputValue, - sequenceNumber: transactionContext.sequenceNumber, - sha256, - signingSerializationType, - transactionOutpoints: transactionContext.transactionOutpoints, - transactionOutputs: transactionContext.transactionOutputs, - transactionSequenceNumbers: transactionContext.transactionSequenceNumbers, - version: transactionContext.version, - }); + const serialization = generateSigningSerializationBCH( + compilationContext, + { coveredBytecode, signingSerializationType }, + sha256 + ); const digest = sha256.hash(sha256.hash(serialization)); const bitcoinEncodedSignature = Uint8Array.from([ - ...sign(privateKey, digest), + ...(sign(privateKey, digest) as Uint8Array), ...signingSerializationType, ]); return { @@ -199,14 +186,13 @@ export const compilerOperationHelperHdKeySignatureBCH = ({ secp256k1Method, }: { operationName: string; - secp256k1Method: keyof NonNullable; + secp256k1Method: keyof NonNullable; }) => attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['hdKeys', 'transactionContext'], - environmentProperties: [ + configurationProperties: [ 'entityOwnership', 'ripemd160', 'secp256k1', @@ -216,25 +202,22 @@ export const compilerOperationHelperHdKeySignatureBCH = ({ 'sourceScriptIds', 'unlockingScripts', ], - operation: (identifier, data, environment): CompilerOperationResult => { - const { hdKeys, transactionContext } = data; - const { - secp256k1, - sha256, - sourceScriptIds, - unlockingScripts, - } = environment; + dataProperties: ['hdKeys', 'compilationContext'], + operation: (identifier, data, configuration): CompilerOperationResult => { + const { hdKeys, compilationContext } = data; + const { secp256k1, sha256, sourceScriptIds, unlockingScripts } = + configuration; const derivationResult = compilerOperationHelperDeriveHdKeyPrivate({ - environment, + configuration, hdKeys, identifier, }); if (derivationResult.status === 'error') return derivationResult; const result = compilerOperationHelperGenerateCoveredBytecode({ + configuration, data, - environment, identifier, sourceScriptIds, unlockingScripts, @@ -245,59 +228,53 @@ export const compilerOperationHelperHdKeySignatureBCH = ({ } return compilerOperationHelperComputeSignatureBCH({ + compilationContext, coveredBytecode: result, identifier, operationName, privateKey: derivationResult.bytecode, sha256, sign: secp256k1[secp256k1Method], - transactionContext, }); }, }) ); -export const compilerOperationHdKeyEcdsaSignatureBCH = compilerOperationHelperHdKeySignatureBCH( - { +export const compilerOperationHdKeyEcdsaSignatureBCH = + compilerOperationHelperHdKeySignatureBCH({ operationName: 'signature', secp256k1Method: 'signMessageHashDER', - } -); -export const compilerOperationHdKeySchnorrSignatureBCH = compilerOperationHelperHdKeySignatureBCH( - { + }); +export const compilerOperationHdKeySchnorrSignatureBCH = + compilerOperationHelperHdKeySignatureBCH({ operationName: 'schnorr_signature', secp256k1Method: 'signMessageHashSchnorr', - } -); + }); export const compilerOperationHelperKeySignatureBCH = ({ operationName, secp256k1Method, }: { operationName: string; - secp256k1Method: keyof NonNullable; + secp256k1Method: keyof NonNullable; }) => attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['keys', 'transactionContext'], - environmentProperties: [ + configurationProperties: [ 'sha256', 'secp256k1', 'unlockingScripts', 'sourceScriptIds', ], - operation: (identifier, data, environment): CompilerOperationResult => { - const { keys, transactionContext } = data; - const { - secp256k1, - sha256, - unlockingScripts, - sourceScriptIds, - } = environment; + dataProperties: ['keys', 'compilationContext'], + operation: (identifier, data, configuration): CompilerOperationResult => { + const { keys, compilationContext } = data; + const { secp256k1, sha256, unlockingScripts, sourceScriptIds } = + configuration; const { privateKeys } = keys; - const [variableId] = identifier.split('.'); + const [variableId] = identifier.split('.') as [string]; const privateKey = privateKeys === undefined ? undefined : privateKeys[variableId]; @@ -311,8 +288,8 @@ export const compilerOperationHelperKeySignatureBCH = ({ } const result = compilerOperationHelperGenerateCoveredBytecode({ + configuration, data, - environment, identifier, sourceScriptIds, unlockingScripts, @@ -323,37 +300,35 @@ export const compilerOperationHelperKeySignatureBCH = ({ } return compilerOperationHelperComputeSignatureBCH({ + compilationContext, coveredBytecode: result, identifier, operationName, privateKey, sha256, sign: secp256k1[secp256k1Method], - transactionContext, }); }, }) ); -export const compilerOperationKeyEcdsaSignatureBCH = compilerOperationHelperKeySignatureBCH( - { +export const compilerOperationKeyEcdsaSignatureBCH = + compilerOperationHelperKeySignatureBCH({ operationName: 'signature', secp256k1Method: 'signMessageHashDER', - } -); -export const compilerOperationKeySchnorrSignatureBCH = compilerOperationHelperKeySignatureBCH( - { + }); +export const compilerOperationKeySchnorrSignatureBCH = + compilerOperationHelperKeySignatureBCH({ operationName: 'schnorr_signature', secp256k1Method: 'signMessageHashSchnorr', - } -); + }); export const compilerOperationHelperComputeDataSignatureBCH = < Data extends CompilationData, - Environment extends AnyCompilationEnvironment + Configuration extends AnyCompilerConfiguration >({ data, - environment, + configuration, identifier, operationName, privateKey, @@ -361,11 +336,14 @@ export const compilerOperationHelperComputeDataSignatureBCH = < sign, }: { data: Data; - environment: Environment; + configuration: Configuration; identifier: string; privateKey: Uint8Array; operationName: string; - sign: (privateKey: Uint8Array, messageHash: Uint8Array) => Uint8Array; + sign: ( + privateKey: Uint8Array, + messageHash: Uint8Array + ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { const [, , scriptId, unknown] = identifier.split('.') as [ @@ -390,8 +368,8 @@ export const compilerOperationHelperComputeDataSignatureBCH = < } const result = compilerOperationHelperCompileScript({ + configuration, data, - environment, targetScriptId: scriptId, }); @@ -408,7 +386,7 @@ export const compilerOperationHelperComputeDataSignatureBCH = < const digest = sha256.hash(result); return { - bytecode: sign(privateKey, digest), + bytecode: sign(privateKey, digest) as Uint8Array, signature: { message: result }, status: 'success', }; @@ -419,19 +397,19 @@ export const compilerOperationHelperKeyDataSignatureBCH = ({ secp256k1Method, }: { operationName: string; - secp256k1Method: keyof NonNullable; + secp256k1Method: keyof NonNullable; }) => attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, + configurationProperties: ['sha256', 'secp256k1'], dataProperties: ['keys'], - environmentProperties: ['sha256', 'secp256k1'], - operation: (identifier, data, environment): CompilerOperationResult => { + operation: (identifier, data, configuration): CompilerOperationResult => { const { keys } = data; - const { secp256k1, sha256 } = environment; + const { secp256k1, sha256 } = configuration; const { privateKeys } = keys; - const [variableId] = identifier.split('.'); + const [variableId] = identifier.split('.') as [string]; const privateKey = privateKeys === undefined ? undefined : privateKeys[variableId]; @@ -446,10 +424,10 @@ export const compilerOperationHelperKeyDataSignatureBCH = ({ return compilerOperationHelperComputeDataSignatureBCH< typeof data, - typeof environment + typeof configuration >({ + configuration, data, - environment, identifier, operationName, privateKey, @@ -460,32 +438,29 @@ export const compilerOperationHelperKeyDataSignatureBCH = ({ }) ); -export const compilerOperationKeyEcdsaDataSignatureBCH = compilerOperationHelperKeyDataSignatureBCH( - { +export const compilerOperationKeyEcdsaDataSignatureBCH = + compilerOperationHelperKeyDataSignatureBCH({ operationName: 'data_signature', secp256k1Method: 'signMessageHashDER', - } -); -export const compilerOperationKeySchnorrDataSignatureBCH = compilerOperationHelperKeyDataSignatureBCH( - { + }); +export const compilerOperationKeySchnorrDataSignatureBCH = + compilerOperationHelperKeyDataSignatureBCH({ operationName: 'schnorr_data_signature', secp256k1Method: 'signMessageHashSchnorr', - } -); + }); export const compilerOperationHelperHdKeyDataSignatureBCH = ({ operationName, secp256k1Method, }: { operationName: string; - secp256k1Method: keyof NonNullable; + secp256k1Method: keyof NonNullable; }) => attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['hdKeys'], - environmentProperties: [ + configurationProperties: [ 'entityOwnership', 'ripemd160', 'secp256k1', @@ -493,12 +468,13 @@ export const compilerOperationHelperHdKeyDataSignatureBCH = ({ 'sha512', 'variables', ], - operation: (identifier, data, environment) => { + dataProperties: ['hdKeys'], + operation: (identifier, data, configuration) => { const { hdKeys } = data; - const { secp256k1, sha256 } = environment; + const { secp256k1, sha256 } = configuration; const derivationResult = compilerOperationHelperDeriveHdKeyPrivate({ - environment, + configuration, hdKeys, identifier, }); @@ -506,10 +482,10 @@ export const compilerOperationHelperHdKeyDataSignatureBCH = ({ return compilerOperationHelperComputeDataSignatureBCH< typeof data, - typeof environment + typeof configuration >({ + configuration, data, - environment, identifier, operationName, privateKey: derivationResult.bytecode, @@ -520,25 +496,23 @@ export const compilerOperationHelperHdKeyDataSignatureBCH = ({ }) ); -export const compilerOperationHdKeyEcdsaDataSignatureBCH = compilerOperationHelperHdKeyDataSignatureBCH( - { +export const compilerOperationHdKeyEcdsaDataSignatureBCH = + compilerOperationHelperHdKeyDataSignatureBCH({ operationName: 'data_signature', secp256k1Method: 'signMessageHashDER', - } -); -export const compilerOperationHdKeySchnorrDataSignatureBCH = compilerOperationHelperHdKeyDataSignatureBCH( - { + }); +export const compilerOperationHdKeySchnorrDataSignatureBCH = + compilerOperationHelperHdKeyDataSignatureBCH({ operationName: 'schnorr_data_signature', secp256k1Method: 'signMessageHashSchnorr', - } -); + }); -export const compilerOperationSigningSerializationFullBCH = compilerOperationRequires( - { +export const compilerOperationSigningSerializationFullBCH = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sha256', 'sourceScriptIds', 'unlockingScripts'], - operation: (identifier, data, environment): CompilerOperationResult => { + configurationProperties: ['sha256', 'sourceScriptIds', 'unlockingScripts'], + dataProperties: ['compilationContext'], + operation: (identifier, data, configuration): CompilerOperationResult => { const [, algorithmOrComponent, unknownPart] = identifier.split('.') as ( | string | undefined @@ -569,10 +543,10 @@ export const compilerOperationSigningSerializationFullBCH = compilerOperationReq }; } - const { sha256, sourceScriptIds, unlockingScripts } = environment; + const { sha256, sourceScriptIds, unlockingScripts } = configuration; const result = compilerOperationHelperGenerateCoveredBytecode({ + configuration, data, - environment, identifier, sourceScriptIds, unlockingScripts, @@ -582,29 +556,20 @@ export const compilerOperationSigningSerializationFullBCH = compilerOperationReq return result; } - const { transactionContext } = data; + const { compilationContext } = data; return { - bytecode: generateSigningSerializationBCH({ - correspondingOutput: transactionContext.correspondingOutput, - coveredBytecode: result, - locktime: transactionContext.locktime, - outpointIndex: transactionContext.outpointIndex, - outpointTransactionHash: transactionContext.outpointTransactionHash, - outputValue: transactionContext.outputValue, - sequenceNumber: transactionContext.sequenceNumber, - sha256, - signingSerializationType, - transactionOutpoints: transactionContext.transactionOutpoints, - transactionOutputs: transactionContext.transactionOutputs, - transactionSequenceNumbers: - transactionContext.transactionSequenceNumbers, - version: transactionContext.version, - }), + bytecode: generateSigningSerializationBCH( + compilationContext, + { + coveredBytecode: result, + signingSerializationType, + }, + sha256 + ), status: 'success', }; }, - } -); + }); /* eslint-disable camelcase, @typescript-eslint/naming-convention */ export const compilerOperationsBCH = { @@ -628,89 +593,69 @@ export const compilerOperationsBCH = { full_all_outputs: compilerOperationSigningSerializationFullBCH, full_all_outputs_single_input: compilerOperationSigningSerializationFullBCH, full_corresponding_output: compilerOperationSigningSerializationFullBCH, - full_corresponding_output_single_input: compilerOperationSigningSerializationFullBCH, + full_corresponding_output_single_input: + compilerOperationSigningSerializationFullBCH, full_no_outputs: compilerOperationSigningSerializationFullBCH, full_no_outputs_single_input: compilerOperationSigningSerializationFullBCH, }, }; /* eslint-enable camelcase, @typescript-eslint/naming-convention */ -export type TransactionContextBCH = TransactionContextCommon; -export type CompilationEnvironmentBCH = CompilationEnvironment< - TransactionContextBCH, +export type CompilerConfigurationBCH = CompilerConfiguration< + CompilationContextBCH, CompilerOperationsKeyBCH >; /** - * Create a compiler using the default BCH environment. + * Create a compiler using the default BCH compiler configuration. * * Internally instantiates the necessary crypto and VM implementations – use - * `createCompiler` for more control. + * {@link compilerConfigurationToCompilerBCH} for more control. * - * @param scriptsAndOverrides - a compilation environment from which properties - * will be used to override properties of the default BCH environment – must + * @param configuration - a compiler configuration from which properties + * will be used to override properties of the default BCH configuration – must * include the `scripts` property */ -export const createCompilerBCH = async < - TransactionContext extends TransactionContextCommon, - Environment extends AnyCompilationEnvironment, +export const createCompilerBCH = < + Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateBCH >( - scriptsAndOverrides: Environment + configuration: Configuration ) => { - const [sha1, sha256, sha512, ripemd160, secp256k1] = await Promise.all([ - instantiateSha1(), - instantiateSha256(), - instantiateSha512(), - instantiateRipemd160(), - instantiateSecp256k1(), - ]); - const vm = createAuthenticationVirtualMachine( - createInstructionSetBCH({ - flags: getFlagsForInstructionSetBCH(instructionSetBCHCurrentStrict), - ripemd160, - secp256k1, - sha1, - sha256, - }) - ); - return createCompiler< - TransactionContext, - Environment, - OpcodesBCH, - ProgramState - >({ + const vm = createAuthenticationVirtualMachine(createInstructionSetBCH()); + return compilerConfigurationToCompilerBCH({ ...{ createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - opcodes: generateBytecodeMap(OpcodesBCH), + opcodes: generateBytecodeMap(OpcodesBCH2022), operations: compilerOperationsBCH, - ripemd160, - secp256k1, - sha256, - sha512, + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + sha512: internalSha512, vm, }, - ...scriptsAndOverrides, + ...configuration, }); }; +export const createCompiler = createCompilerBCH; + /** * Create a BCH `Compiler` from an `AuthenticationTemplate` and an optional set * of overrides. * @param template - the `AuthenticationTemplate` from which to create the BCH * compiler - * @param overrides - a compilation environment from which properties will be - * used to override properties of the default BCH environment + * @param overrides - a compiler configuration from which properties will be + * used to override properties of the default BCH configuration */ -export const authenticationTemplateToCompilerBCH = async < - TransactionContext extends TransactionContextCommon, - Environment extends AnyCompilationEnvironment, +export const authenticationTemplateToCompilerBCH = < + Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateBCH >( template: AuthenticationTemplate, - overrides?: CompilationEnvironment + overrides?: Configuration ) => - createCompilerBCH({ + createCompilerBCH({ ...overrides, - ...authenticationTemplateToCompilationEnvironment(template), - } as Environment); + ...authenticationTemplateToCompilerConfiguration(template), + } as Configuration); diff --git a/src/lib/template/compiler-defaults.ts b/src/lib/compiler/compiler-defaults.ts similarity index 51% rename from src/lib/template/compiler-defaults.ts rename to src/lib/compiler/compiler-defaults.ts index aefa836e..79583176 100644 --- a/src/lib/template/compiler-defaults.ts +++ b/src/lib/compiler/compiler-defaults.ts @@ -1,8 +1,14 @@ +/* eslint-disable @typescript-eslint/no-duplicate-enum-values */ export enum CompilerDefaults { /** - * The `addressIndex` used by default scenarios. + * The `addressIndex` used by the default scenario `data`. */ defaultScenarioAddressIndex = 0, + /** + * The value used for `["slot"]` and `["copy"]` locking or unlocking bytecode + * when generating a scenario and no `unlockingScriptId` is provided. + */ + defaultScenarioBytecode = '', /** * * The value of `currentBlockHeight` in the default authentication template @@ -10,20 +16,17 @@ export enum CompilerDefaults { * block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. * * This default value was chosen to be low enough to simplify the debugging of - * block height offsets while remaining differentiated from `0` and `1` which + * block height offsets while remaining differentiated from `0` and `1`, which * are used both as boolean return values and for control flow. */ defaultScenarioCurrentBlockHeight = 2, /** * The value of `currentBlockTime` in the default authentication template * scenario. This is the Median Time-Past block time (BIP113) of block `2` - * (the block used in `defaultScenarioCurrentBlockHeight`). + * (the block used in + * {@link CompilerDefaults.defaultScenarioCurrentBlockHeight}). */ defaultScenarioCurrentBlockTime = 1231469665, - /** - * The default `outpointIndex` of inputs in scenarios. - */ - defaultScenarioInputOutpointIndex = 0, /** * The default `outpointTransactionHash` of inputs in scenarios. */ @@ -33,19 +36,9 @@ export enum CompilerDefaults { */ defaultScenarioInputSequenceNumber = 0, /** - * The default `unlockingBytecode` of untested inputs in scenarios. - */ - defaultScenarioInputUnlockingBytecodeHex = '', - /** - * The default `satoshis` of outputs in scenarios. - */ - defaultScenarioOutputSatoshis = 0, - /** - * The hexadecimal-encoded value of the `lockingBytecode` in the single - * default output (`transaction.outputs`) of the default authentication - * template scenario. + * The default `valueSatoshis` of outputs in scenarios. */ - defaultScenarioTransactionOutputsLockingBytecodeHex = '', + defaultScenarioOutputValueSatoshis = 0, /** * The value of `transaction.locktime` in the default authentication template * scenario. @@ -58,11 +51,7 @@ export enum CompilerDefaults { */ defaultScenarioTransactionVersion = 2, /** - * The default value of the hypothetical UTXO being spent by the input under - * test in a scenario. - */ - defaultScenarioValue = 0, - /** + *s * If unset, each `HdKey` uses this `addressOffset`. */ hdKeyAddressOffset = 0, @@ -77,29 +66,8 @@ export enum CompilerDefaults { /** * The prefix used to refer to other scenario bytecode scripts from within a - * bytecode script. See `AuthenticationTemplateScenarioData.bytecode` for - * details. - */ - scenarioBytecodeScriptPrefix = '_scenario_', - - /** - * The prefix used to identify the `check` script from a virtualized - * `AuthenticationTemplateScriptTest`. For details, see - * `authenticationTemplateToCompilationEnvironmentVirtualizedTests`. - */ - virtualizedTestCheckScriptPrefix = '__virtualized_test_check_', - - /** - * The prefix used to identify the concatenated tested and `check` script from - * a virtualized `AuthenticationTemplateScriptTest`. For details, see - * `authenticationTemplateToCompilationEnvironmentVirtualizedTests`. - */ - virtualizedTestLockingScriptPrefix = '__virtualized_test_lock_', - - /** - * The prefix used to identify the `setup` script from a virtualized - * `AuthenticationTemplateScriptTest`. For details, see - * `authenticationTemplateToCompilationEnvironmentVirtualizedTests`. + * bytecode script. See {@link AuthenticationTemplateScenarioData.bytecode} + * for details. */ - virtualizedTestUnlockingScriptPrefix = '__virtualized_test_unlock_', + scenarioBytecodeScriptPrefix = '_scenario.', } diff --git a/src/lib/template/compiler-operation-helpers.spec.ts b/src/lib/compiler/compiler-operation-helpers.spec.ts similarity index 69% rename from src/lib/template/compiler-operation-helpers.spec.ts rename to src/lib/compiler/compiler-operation-helpers.spec.ts index 1616c002..9ae9789b 100644 --- a/src/lib/template/compiler-operation-helpers.spec.ts +++ b/src/lib/compiler/compiler-operation-helpers.spec.ts @@ -1,18 +1,17 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; import { compilerOperationHelperGenerateCoveredBytecode, compilerOperationRequires, stringifyTestVector, -} from '../lib'; +} from '../lib.js'; -test('attemptCompilerOperations: can skip environment property check', (t) => { +test('attemptCompilerOperations: can skip configuration property check', (t) => { t.deepEqual( compilerOperationRequires({ canBeSkipped: true, + configurationProperties: ['entityOwnership'], dataProperties: [], - environmentProperties: ['entityOwnership'], operation: () => ({ error: 'test failed', status: 'error' }), })('', {}, { scripts: {} }), { status: 'skip' } @@ -21,8 +20,8 @@ test('attemptCompilerOperations: can skip environment property check', (t) => { test('compilerOperationHelperGenerateCoveredBytecode: empty sourceScriptIds', (t) => { const result = compilerOperationHelperGenerateCoveredBytecode({ + configuration: { scripts: {} }, data: {}, - environment: { scripts: {} }, identifier: 'test', sourceScriptIds: [], unlockingScripts: {}, @@ -31,7 +30,7 @@ test('compilerOperationHelperGenerateCoveredBytecode: empty sourceScriptIds', (t result, { error: - 'Identifier "test" requires a signing serialization, but "coveredBytecode" cannot be determined because the compilation environment\'s "sourceScriptIds" is empty.', + 'Identifier "test" requires a signing serialization, but "coveredBytecode" cannot be determined because the compiler configuration\'s "sourceScriptIds" is empty.', status: 'error', }, stringifyTestVector(result) diff --git a/src/lib/compiler/compiler-operation-helpers.ts b/src/lib/compiler/compiler-operation-helpers.ts new file mode 100644 index 00000000..e1cd36a5 --- /dev/null +++ b/src/lib/compiler/compiler-operation-helpers.ts @@ -0,0 +1,379 @@ +import { decodeHdPrivateKey, deriveHdPath } from '../key/key.js'; +import { resolveScriptIdentifier } from '../language/language.js'; +import type { + AnyCompilerConfiguration, + AuthenticationTemplateHdKey, + CompilationContextBCH, + CompilationData, + CompilerConfiguration, + CompilerOperation, + CompilerOperationErrorFatal, + CompilerOperationResult, + CompilerOperationSkip, +} from '../lib'; + +import { CompilerDefaults } from './compiler-defaults.js'; + +/** + * Attempt a series of compiler operations, skipping to the next operation if + * the current operation returns a {@link CompilerOperationSkip} (indicating it + * failed and can be skipped). The `finalOperation` may not be skipped, and must + * either return {@link CompilerOperationSuccess} or + * {@link CompilerOperationError}. + * + * @param operations - an array of skippable operations to try + * @param finalOperation - a final, un-skippable operation + */ +export const attemptCompilerOperations = + ( + operations: CompilerOperation[], + finalOperation: CompilerOperation + ): CompilerOperation => + (identifier, data, configuration) => { + // eslint-disable-next-line functional/no-loop-statement + for (const operation of operations) { + const result = operation(identifier, data, configuration); + if (result.status !== 'skip') return result; + } + return finalOperation(identifier, data, configuration); + }; + +/** + * Modify a compiler operation to verify that certain properties exist in the + * {@link CompilationData} and {@link CompilerConfiguration} before executing + * the provided operation. If the properties don't exist, an error message + * is returned. + * + * This is useful for eliminating repetitive existence checks. + */ +export const compilerOperationRequires = + < + CanBeSkipped extends boolean, + RequiredDataProperties extends keyof CompilationData, + RequiredConfigurationProperties extends keyof CompilerConfiguration, + CompilationContext = CompilationContextBCH + >({ + /** + * If `true`, the accepted operation may return `false`, and any missing + * properties will cause the returned operation to return `false` (meaning + * the operation should be skipped) + */ + canBeSkipped, + /** + * An array of the top-level properties required in the + * {@link CompilationData}. + */ + dataProperties, + /** + * An array of the top-level properties required in the + * {@link CompilerConfiguration} + */ + configurationProperties, + /** + * The operation to run if all required properties exist + */ + operation, + }: { + canBeSkipped: CanBeSkipped; + dataProperties: RequiredDataProperties[]; + configurationProperties: RequiredConfigurationProperties[]; + operation: ( + identifier: string, + data: CompilationData & + Required< + Pick, RequiredDataProperties> + >, + configuration: CompilerConfiguration & + Required< + Pick< + CompilerConfiguration, + RequiredConfigurationProperties + > + > + ) => CompilerOperationResult; + }): CompilerOperation => + // eslint-disable-next-line complexity + (identifier, data, configuration) => { + // eslint-disable-next-line functional/no-loop-statement + for (const property of configurationProperties) { + if (configuration[property] === undefined) + return ( + canBeSkipped + ? { status: 'skip' } + : { + error: `Cannot resolve "${identifier}" – the "${property}" property was not provided in the compiler configuration.`, + status: 'error', + } + ) as CanBeSkipped extends true + ? CompilerOperationSkip + : CompilerOperationErrorFatal; + } + // eslint-disable-next-line functional/no-loop-statement + for (const property of dataProperties) { + if ( + (data[property] as typeof data[typeof property] | undefined) === + undefined + ) + return ( + canBeSkipped + ? { status: 'skip' } + : { + error: `Cannot resolve "${identifier}" – the "${property}" property was not provided in the compilation data.`, + status: 'error', + } + ) as CanBeSkipped extends true + ? CompilerOperationSkip + : CompilerOperationErrorFatal; + } + + return operation( + identifier, + data as Required< + Pick, RequiredDataProperties> + >, + configuration as CompilerConfiguration & + Required< + Pick< + CompilerConfiguration, + RequiredConfigurationProperties + > + > + ); + }; + +export const compilerOperationAttemptBytecodeResolution = + compilerOperationRequires({ + canBeSkipped: true, + configurationProperties: [], + dataProperties: ['bytecode'], + operation: (identifier, data) => { + const { bytecode } = data; + if (bytecode[identifier] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return { bytecode: bytecode[identifier]!, status: 'success' }; + } + return { status: 'skip' }; + }, + }); + +// eslint-disable-next-line complexity +export const compilerOperationHelperDeriveHdPrivateNode = ({ + addressIndex, + entityId, + entityHdPrivateKey, + configuration, + hdKey, + identifier, +}: { + addressIndex: number; + entityId: string; + entityHdPrivateKey: string; + configuration: { + ripemd160: NonNullable; + secp256k1: NonNullable; + sha256: NonNullable; + sha512: NonNullable; + }; + hdKey: AuthenticationTemplateHdKey; + identifier: string; +}): CompilerOperationResult => { + const addressOffset = + hdKey.addressOffset ?? CompilerDefaults.hdKeyAddressOffset; + const privateDerivationPath = + hdKey.privateDerivationPath ?? CompilerDefaults.hdKeyPrivateDerivationPath; + const i = addressIndex + addressOffset; + + const validPrivatePathWithIndex = /^m(?:\/(?:[0-9]+|i)'?)*$/u; + if (!validPrivatePathWithIndex.test(privateDerivationPath)) { + return { + error: `Could not generate ${identifier} – the path "${privateDerivationPath}" is not a valid "privateDerivationPath".`, + status: 'error', + }; + } + + const instancePath = privateDerivationPath.replace('i', i.toString()); + + const masterContents = decodeHdPrivateKey(entityHdPrivateKey, configuration); + if (typeof masterContents === 'string') { + return { + error: `Could not generate ${identifier} – the HD private key provided for ${entityId} could not be decoded: ${masterContents}`, + status: 'error', + }; + } + + const instanceNode = deriveHdPath( + masterContents.node, + instancePath, + configuration + ); + + if (typeof instanceNode === 'string') { + return { + error: `Could not generate ${identifier} – the path "${instancePath}" could not be derived for entity "${entityId}": ${instanceNode}`, + status: 'error', + }; + } + + return { + bytecode: instanceNode.privateKey, + status: 'success', + }; +}; + +export const compilerOperationHelperUnknownEntity = ( + identifier: string, + variableId: string +) => ({ + error: `Identifier "${identifier}" refers to an HdKey, but the "entityOwnership" for "${variableId}" is not available in this compiler configuration.`, + status: 'error' as const, +}); + +export const compilerOperationHelperAddressIndex = (identifier: string) => ({ + error: `Identifier "${identifier}" refers to an HdKey, but "hdKeys.addressIndex" was not provided in the compilation data.`, + status: 'error' as const, +}); + +export const compilerOperationHelperDeriveHdKeyPrivate = ({ + configuration, + hdKeys, + identifier, +}: { + configuration: { + entityOwnership: NonNullable; + ripemd160: NonNullable; + secp256k1: NonNullable; + sha256: NonNullable; + sha512: NonNullable; + variables: NonNullable; + }; + hdKeys: NonNullable; + identifier: string; +}): CompilerOperationResult => { + const { addressIndex, hdPrivateKeys } = hdKeys; + const [variableId] = identifier.split('.') as [string]; + + const entityId = configuration.entityOwnership[variableId]; + if (entityId === undefined) { + return compilerOperationHelperUnknownEntity(identifier, variableId); + } + + if (addressIndex === undefined) { + return compilerOperationHelperAddressIndex(identifier); + } + + const entityHdPrivateKey = + hdPrivateKeys === undefined ? undefined : hdPrivateKeys[entityId]; + + if (entityHdPrivateKey === undefined) { + return { + error: `Identifier "${identifier}" refers to an HdKey owned by "${entityId}", but an HD private key for this entity (or an existing signature) was not provided in the compilation data.`, + recoverable: true, + status: 'error', + }; + } + + /** + * Guaranteed to be an `HdKey` if this method is reached in the compiler. + */ + const hdKey = configuration.variables[ + variableId + ] as AuthenticationTemplateHdKey; + + return compilerOperationHelperDeriveHdPrivateNode({ + addressIndex, + configuration, + entityHdPrivateKey, + entityId, + hdKey, + identifier, + }); +}; + +/** + * Returns `false` if the target script ID doesn't exist in the compiler + * configuration (allows for the caller to generate the error message). + * + * If the compilation produced errors, returns a + * {@link CompilerOperationErrorFatal}. + * + * If the compilation was successful, returns the compiled bytecode as a + * `Uint8Array`. + */ +export const compilerOperationHelperCompileScript = ({ + targetScriptId, + data, + configuration, +}: { + targetScriptId: string; + data: CompilationData; + configuration: AnyCompilerConfiguration; +}) => { + const signingTarget = configuration.scripts[targetScriptId]; + + const compiledTarget = resolveScriptIdentifier({ + configuration, + data, + identifier: targetScriptId, + }); + if (signingTarget === undefined || compiledTarget === false) { + return false; + } + if (typeof compiledTarget === 'string') { + return { + error: compiledTarget, + status: 'error', + } as CompilerOperationErrorFatal; + } + return compiledTarget.bytecode; +}; + +/** + * Returns either the properly generated `coveredBytecode` or a + * {@link CompilerOperationErrorFatal}. + */ +export const compilerOperationHelperGenerateCoveredBytecode = < + CompilationContext +>({ + data, + configuration, + identifier, + sourceScriptIds, + unlockingScripts, +}: { + data: CompilationData; + configuration: AnyCompilerConfiguration; + identifier: string; + sourceScriptIds: string[]; + unlockingScripts: { [unlockingScriptId: string]: string }; +}): CompilerOperationErrorFatal | Uint8Array => { + const currentScriptId = sourceScriptIds[sourceScriptIds.length - 1]; + if (currentScriptId === undefined) { + return { + error: `Identifier "${identifier}" requires a signing serialization, but "coveredBytecode" cannot be determined because the compiler configuration's "sourceScriptIds" is empty.`, + status: 'error', + }; + } + + const targetLockingScriptId = unlockingScripts[currentScriptId]; + if (targetLockingScriptId === undefined) { + return { + error: `Identifier "${identifier}" requires a signing serialization, but "coveredBytecode" cannot be determined because "${currentScriptId}" is not present in the compiler configuration's "unlockingScripts".`, + status: 'error', + }; + } + + const result = compilerOperationHelperCompileScript({ + configuration, + data, + targetScriptId: targetLockingScriptId, + }); + + if (result === false) { + return { + error: `Identifier "${identifier}" requires a signing serialization that covers an unknown locking script, "${targetLockingScriptId}".`, + status: 'error', + }; + } + + return result; +}; diff --git a/src/lib/template/compiler-operations.ts b/src/lib/compiler/compiler-operations.ts similarity index 52% rename from src/lib/template/compiler-operations.ts rename to src/lib/compiler/compiler-operations.ts index db05ce1f..c26221c7 100644 --- a/src/lib/template/compiler-operations.ts +++ b/src/lib/compiler/compiler-operations.ts @@ -1,8 +1,20 @@ -import { bigIntToBitcoinVarInt, numberToBinUint32LE } from '../format/numbers'; -import { decodeHdPublicKey, deriveHdPath } from '../key/hd-key'; -import { bigIntToScriptNumber } from '../vm/instruction-sets/instruction-sets'; +import { bigIntToVarInt, numberToBinUint32LE } from '../format/format.js'; +import { decodeHdPublicKey, deriveHdPath } from '../key/key.js'; +import type { + AuthenticationTemplateHdKey, + CompilerOperationResult, +} from '../lib'; +import { + encodeTransactionInputSequenceNumbersForSigning, + encodeTransactionOutpoints, + encodeTransactionOutputsForSigning, +} from '../message/message.js'; +import { + bigIntToVmNumber, + generateSigningSerializationComponentsBCH, +} from '../vm/vm.js'; -import { CompilerDefaults } from './compiler-defaults'; +import { CompilerDefaults } from './compiler-defaults.js'; import { attemptCompilerOperations, compilerOperationAttemptBytecodeResolution, @@ -11,18 +23,17 @@ import { compilerOperationHelperGenerateCoveredBytecode, compilerOperationHelperUnknownEntity, compilerOperationRequires, -} from './compiler-operation-helpers'; -import { CompilerOperationResult } from './compiler-types'; -import { AuthenticationTemplateHdKey } from './template-types'; +} from './compiler-operation-helpers.js'; export const compilerOperationAddressData = compilerOperationRequires({ canBeSkipped: false, + configurationProperties: [], dataProperties: ['bytecode'], - environmentProperties: [], operation: (identifier, data) => { const { bytecode } = data; if (identifier in bytecode) { - return { bytecode: bytecode[identifier], status: 'success' }; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return { bytecode: bytecode[identifier]!, status: 'success' }; } return { error: `Identifier "${identifier}" refers to an AddressData, but "${identifier}" was not provided in the CompilationData "bytecode".`, @@ -34,12 +45,13 @@ export const compilerOperationAddressData = compilerOperationRequires({ export const compilerOperationWalletData = compilerOperationRequires({ canBeSkipped: false, + configurationProperties: [], dataProperties: ['bytecode'], - environmentProperties: [], operation: (identifier, data) => { const { bytecode } = data; if (identifier in bytecode) { - return { bytecode: bytecode[identifier], status: 'success' }; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return { bytecode: bytecode[identifier]!, status: 'success' }; } return { error: `Identifier "${identifier}" refers to a WalletData, but "${identifier}" was not provided in the CompilationData "bytecode".`, @@ -51,72 +63,74 @@ export const compilerOperationWalletData = compilerOperationRequires({ export const compilerOperationCurrentBlockTime = compilerOperationRequires({ canBeSkipped: false, + configurationProperties: [], dataProperties: ['currentBlockTime'], - environmentProperties: [], - operation: (_, data) => { - return { - bytecode: numberToBinUint32LE(data.currentBlockTime), - status: 'success', - }; - }, + operation: (_, data) => ({ + bytecode: numberToBinUint32LE(data.currentBlockTime), + status: 'success', + }), }); export const compilerOperationCurrentBlockHeight = compilerOperationRequires({ canBeSkipped: false, + configurationProperties: [], dataProperties: ['currentBlockHeight'], - environmentProperties: [], operation: (_, data) => ({ - bytecode: bigIntToScriptNumber(BigInt(data.currentBlockHeight)), + bytecode: bigIntToVmNumber(BigInt(data.currentBlockHeight)), status: 'success', }), }); -export const compilerOperationSigningSerializationCorrespondingOutput = compilerOperationRequires( - { +export const compilerOperationSigningSerializationCorrespondingOutput = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], - operation: (_, data) => - data.transactionContext.correspondingOutput === undefined + configurationProperties: [], + dataProperties: ['compilationContext'], + operation: (_, data) => { + const { correspondingOutput } = generateSigningSerializationComponentsBCH( + data.compilationContext + ); + return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } : { - bytecode: data.transactionContext.correspondingOutput, + bytecode: correspondingOutput, status: 'success', - }, - } -); + }; + }, + }); -export const compilerOperationSigningSerializationCorrespondingOutputHash = compilerOperationRequires( - { +export const compilerOperationSigningSerializationCorrespondingOutputHash = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sha256'], - operation: (_, data, environment) => - data.transactionContext.correspondingOutput === undefined + configurationProperties: ['sha256'], + dataProperties: ['compilationContext'], + operation: (_, data, configuration) => { + const { correspondingOutput } = generateSigningSerializationComponentsBCH( + data.compilationContext + ); + return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } : { - bytecode: environment.sha256.hash( - environment.sha256.hash( - data.transactionContext.correspondingOutput - ) + bytecode: configuration.sha256.hash( + configuration.sha256.hash(correspondingOutput) ), status: 'success', - }, - } -); + }; + }, + }); const compilerOperationHelperSigningSerializationCoveredBytecode = ( returnLength: boolean ) => compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sourceScriptIds', 'unlockingScripts'], - operation: (identifier, data, environment) => { - const { unlockingScripts, sourceScriptIds } = environment; + configurationProperties: ['sourceScriptIds', 'unlockingScripts'], + dataProperties: ['compilationContext'], + operation: (identifier, data, configuration) => { + const { unlockingScripts, sourceScriptIds } = configuration; const result = compilerOperationHelperGenerateCoveredBytecode({ + configuration, data, - environment, identifier, sourceScriptIds, unlockingScripts, @@ -127,193 +141,211 @@ const compilerOperationHelperSigningSerializationCoveredBytecode = ( } return { - bytecode: returnLength - ? bigIntToBitcoinVarInt(BigInt(result.length)) - : result, + bytecode: returnLength ? bigIntToVarInt(BigInt(result.length)) : result, status: 'success', }; }, }); -export const compilerOperationSigningSerializationCoveredBytecode = compilerOperationHelperSigningSerializationCoveredBytecode( - false -); -export const compilerOperationSigningSerializationCoveredBytecodeLength = compilerOperationHelperSigningSerializationCoveredBytecode( - true -); +export const compilerOperationSigningSerializationCoveredBytecode = + compilerOperationHelperSigningSerializationCoveredBytecode(false); +export const compilerOperationSigningSerializationCoveredBytecodeLength = + compilerOperationHelperSigningSerializationCoveredBytecode(true); -export const compilerOperationSigningSerializationLocktime = compilerOperationRequires( - { +export const compilerOperationSigningSerializationLocktime = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: numberToBinUint32LE(data.transactionContext.locktime), + bytecode: numberToBinUint32LE( + data.compilationContext.transaction.locktime + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationOutpointIndex = compilerOperationRequires( - { +export const compilerOperationSigningSerializationOutpointIndex = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: numberToBinUint32LE(data.transactionContext.outpointIndex), + bytecode: numberToBinUint32LE( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data.compilationContext.transaction.inputs[ + data.compilationContext.inputIndex + ]!.outpointIndex + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationOutpointTransactionHash = compilerOperationRequires( - { +export const compilerOperationSigningSerializationOutpointTransactionHash = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: data.transactionContext.outpointTransactionHash, + bytecode: + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data.compilationContext.transaction.inputs[ + data.compilationContext.inputIndex + ]!.outpointTransactionHash, status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationOutputValue = compilerOperationRequires( - { +export const compilerOperationSigningSerializationOutputValue = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: data.transactionContext.outputValue, + bytecode: + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data.compilationContext.sourceOutputs[ + data.compilationContext.inputIndex + ]!.valueSatoshis, status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationSequenceNumber = compilerOperationRequires( - { +export const compilerOperationSigningSerializationSequenceNumber = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: numberToBinUint32LE(data.transactionContext.sequenceNumber), + bytecode: numberToBinUint32LE( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data.compilationContext.transaction.inputs[ + data.compilationContext.inputIndex + ]!.sequenceNumber + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionOutpoints = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionOutpoints = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: data.transactionContext.transactionOutpoints, + bytecode: encodeTransactionOutpoints( + data.compilationContext.transaction.inputs + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionOutpointsHash = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionOutpointsHash = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sha256'], - operation: (_, data, environment) => ({ - bytecode: environment.sha256.hash( - environment.sha256.hash(data.transactionContext.transactionOutpoints) + configurationProperties: ['sha256'], + dataProperties: ['compilationContext'], + operation: (_, data, configuration) => ({ + bytecode: configuration.sha256.hash( + configuration.sha256.hash( + encodeTransactionOutpoints(data.compilationContext.transaction.inputs) + ) ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionOutputs = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionOutputs = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: data.transactionContext.transactionOutputs, + bytecode: encodeTransactionOutputsForSigning( + data.compilationContext.transaction.outputs + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionOutputsHash = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionOutputsHash = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sha256'], - operation: (_, data, environment) => ({ - bytecode: environment.sha256.hash( - environment.sha256.hash(data.transactionContext.transactionOutputs) + configurationProperties: ['sha256'], + dataProperties: ['compilationContext'], + operation: (_, data, configuration) => ({ + bytecode: configuration.sha256.hash( + configuration.sha256.hash( + encodeTransactionOutputsForSigning( + data.compilationContext.transaction.outputs + ) + ) ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionSequenceNumbers = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionSequenceNumbers = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: data.transactionContext.transactionSequenceNumbers, + bytecode: encodeTransactionInputSequenceNumbersForSigning( + data.compilationContext.transaction.inputs + ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationTransactionSequenceNumbersHash = compilerOperationRequires( - { +export const compilerOperationSigningSerializationTransactionSequenceNumbersHash = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: ['sha256'], - operation: (_, data, environment) => ({ - bytecode: environment.sha256.hash( - environment.sha256.hash( - data.transactionContext.transactionSequenceNumbers + configurationProperties: ['sha256'], + dataProperties: ['compilationContext'], + operation: (_, data, configuration) => ({ + bytecode: configuration.sha256.hash( + configuration.sha256.hash( + encodeTransactionInputSequenceNumbersForSigning( + data.compilationContext.transaction.inputs + ) ) ), status: 'success', }), - } -); + }); -export const compilerOperationSigningSerializationVersion = compilerOperationRequires( - { +export const compilerOperationSigningSerializationVersion = + compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['transactionContext'], - environmentProperties: [], + configurationProperties: [], + dataProperties: ['compilationContext'], operation: (_, data) => ({ - bytecode: numberToBinUint32LE(data.transactionContext.version), + bytecode: numberToBinUint32LE( + data.compilationContext.transaction.version + ), status: 'success', }), - } -); + }); export const compilerOperationKeyPublicKeyCommon = attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, + configurationProperties: ['secp256k1'], dataProperties: ['keys'], - environmentProperties: ['secp256k1'], - operation: (identifier, data, environment) => { + operation: (identifier, data, configuration) => { const { keys } = data; - const { secp256k1 } = environment; + const { secp256k1 } = configuration; const { privateKeys } = keys; - const [variableId] = identifier.split('.'); + const [variableId] = identifier.split('.') as [string]; - if ( - privateKeys !== undefined && - (privateKeys[variableId] as Uint8Array | undefined) !== undefined - ) { + if (privateKeys?.[variableId] !== undefined) { return { bytecode: secp256k1.derivePublicKeyCompressed( - privateKeys[variableId] - ), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + privateKeys[variableId]! + ) as Uint8Array, status: 'success', }; } @@ -330,8 +362,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( [compilerOperationAttemptBytecodeResolution], compilerOperationRequires({ canBeSkipped: false, - dataProperties: ['hdKeys'], - environmentProperties: [ + configurationProperties: [ 'entityOwnership', 'ripemd160', 'secp256k1', @@ -339,16 +370,15 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( 'sha512', 'variables', ], + dataProperties: ['hdKeys'], operation: // eslint-disable-next-line complexity - (identifier, data, environment): CompilerOperationResult => { + (identifier, data, configuration): CompilerOperationResult => { const { hdKeys } = data; const { hdPrivateKeys, addressIndex, hdPublicKeys } = hdKeys; - const [variableId] = identifier.split('.'); + const [variableId] = identifier.split('.') as [string]; - const entityId = environment.entityOwnership[variableId] as - | string - | undefined; + const entityId = configuration.entityOwnership[variableId]; if (entityId === undefined) { return compilerOperationHelperUnknownEntity(identifier, variableId); } @@ -363,24 +393,24 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( /** * Guaranteed to be an `HdKey` if this method is reached in the compiler. */ - const hdKey = environment.variables[ + const hdKey = configuration.variables[ variableId ] as AuthenticationTemplateHdKey; if (entityHdPrivateKey !== undefined) { const privateResult = compilerOperationHelperDeriveHdPrivateNode({ addressIndex, + configuration, entityHdPrivateKey, entityId, - environment, hdKey, identifier, }); if (privateResult.status === 'error') return privateResult; return { - bytecode: environment.secp256k1.derivePublicKeyCompressed( + bytecode: configuration.secp256k1.derivePublicKeyCompressed( privateResult.bytecode - ), + ) as Uint8Array, status: 'success', }; } @@ -416,8 +446,8 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( const instancePath = publicDerivationPath.replace('i', i.toString()); const masterContents = decodeHdPublicKey( - environment, - entityHdPublicKey + entityHdPublicKey, + configuration ); if (typeof masterContents === 'string') { return { @@ -427,9 +457,9 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( } const instanceNode = deriveHdPath( - environment, masterContents.node, - instancePath + instancePath, + configuration ); if (typeof instanceNode === 'string') { @@ -456,21 +486,31 @@ export const compilerOperationsCommon = { public_key: compilerOperationKeyPublicKeyCommon, }, signingSerialization: { - corresponding_output: compilerOperationSigningSerializationCorrespondingOutput, - corresponding_output_hash: compilerOperationSigningSerializationCorrespondingOutputHash, + corresponding_output: + compilerOperationSigningSerializationCorrespondingOutput, + corresponding_output_hash: + compilerOperationSigningSerializationCorrespondingOutputHash, covered_bytecode: compilerOperationSigningSerializationCoveredBytecode, - covered_bytecode_length: compilerOperationSigningSerializationCoveredBytecodeLength, + covered_bytecode_length: + compilerOperationSigningSerializationCoveredBytecodeLength, locktime: compilerOperationSigningSerializationLocktime, outpoint_index: compilerOperationSigningSerializationOutpointIndex, - outpoint_transaction_hash: compilerOperationSigningSerializationOutpointTransactionHash, + outpoint_transaction_hash: + compilerOperationSigningSerializationOutpointTransactionHash, output_value: compilerOperationSigningSerializationOutputValue, sequence_number: compilerOperationSigningSerializationSequenceNumber, - transaction_outpoints: compilerOperationSigningSerializationTransactionOutpoints, - transaction_outpoints_hash: compilerOperationSigningSerializationTransactionOutpointsHash, - transaction_outputs: compilerOperationSigningSerializationTransactionOutputs, - transaction_outputs_hash: compilerOperationSigningSerializationTransactionOutputsHash, - transaction_sequence_numbers: compilerOperationSigningSerializationTransactionSequenceNumbers, - transaction_sequence_numbers_hash: compilerOperationSigningSerializationTransactionSequenceNumbersHash, + transaction_outpoints: + compilerOperationSigningSerializationTransactionOutpoints, + transaction_outpoints_hash: + compilerOperationSigningSerializationTransactionOutpointsHash, + transaction_outputs: + compilerOperationSigningSerializationTransactionOutputs, + transaction_outputs_hash: + compilerOperationSigningSerializationTransactionOutputsHash, + transaction_sequence_numbers: + compilerOperationSigningSerializationTransactionSequenceNumbers, + transaction_sequence_numbers_hash: + compilerOperationSigningSerializationTransactionSequenceNumbersHash, version: compilerOperationSigningSerializationVersion, }, walletData: compilerOperationWalletData, diff --git a/src/lib/template/compiler-types.ts b/src/lib/compiler/compiler-types.ts similarity index 52% rename from src/lib/template/compiler-types.ts rename to src/lib/compiler/compiler-types.ts index f8d27911..c564e76d 100644 --- a/src/lib/template/compiler-types.ts +++ b/src/lib/compiler/compiler-types.ts @@ -1,28 +1,28 @@ -import { Ripemd160, Secp256k1, Sha256, Sha512 } from '../crypto/crypto'; -import { TransactionContextCommon } from '../transaction/transaction-types'; -import { AuthenticationVirtualMachine } from '../vm/virtual-machine'; -import { AuthenticationProgramTransactionContextCommon } from '../vm/vm-types'; - -import { - CompilationResult, - CompilationResultError, -} from './language/language-types'; -import { +import type { + AuthenticationProgramCommon, AuthenticationTemplateScenario, AuthenticationTemplateVariable, -} from './template-types'; + AuthenticationVirtualMachine, + CompilationContextBCH, + CompilationResult, + CompilationResultError, + Ripemd160, + Secp256k1, + Sha256, + Sha512, +} from '../lib'; export interface CompilerOperationDebug { /** - * An additional, complex property which may be returned by custom compiler + * An additional, complex property that may be returned by custom compiler * operations. For use in extending the compiler to support additional return - * information like `CompilerOperationSuccessSignature`. + * information like {@link CompilerOperationSuccessSignature}. */ debug?: unknown; } /** - * A non-recoverable error in a compiler operation. This is any error which + * A non-recoverable error in a compiler operation. This is any error that * cannot be resolved by simply providing a missing variable. */ export interface CompilerOperationErrorFatal extends CompilerOperationDebug { @@ -66,13 +66,13 @@ export interface CompilerOperationSuccessGeneric /** * A successful signature-generation compiler operation. This provides slightly - * more debugging information than `CompilerOperationSuccessGeneric`. The - * signing serialization or data message which was hashed to produce the + * more debugging information than {@link CompilerOperationSuccessGeneric}. The + * signing serialization or data message that was hashed to produce the * to-be-signed message is also provided in the result. */ export type CompilerOperationSuccessSignatureType = - | CompilerOperationSuccessSignature - | CompilerOperationSuccessDataSignature; + | CompilerOperationSuccessDataSignature + | CompilerOperationSuccessSignature; /** * The result of a successful `signature` compiler operation. @@ -103,67 +103,63 @@ export interface CompilerOperationSuccessDataSignature } /** - * An unsuccessful compiler operation result which should be skipped by the - * compiler. See `attemptCompilerOperations` for details. + * An unsuccessful compiler operation result that should be skipped by the + * compiler. See {@link attemptCompilerOperations} for details. */ export interface CompilerOperationSkip { status: 'skip'; } -export type CompilerOperationResult< - CanBeSkipped extends boolean = false -> = CanBeSkipped extends true - ? CompilerOperationError | CompilerOperationSuccess | CompilerOperationSkip - : CompilerOperationError | CompilerOperationSuccess; +export type CompilerOperationResult = + CanBeSkipped extends true + ? CompilerOperationError | CompilerOperationSkip | CompilerOperationSuccess + : CompilerOperationError | CompilerOperationSuccess; /** - * A compiler operation method which accepts the identifier being evaluated, the - * compilation data, and the compilation environment, and returns a - * `CompilerOperationResult`. + * A compiler operation method that accepts the identifier being evaluated, the + * compilation data, and the compiler configuration, and returns a + * {@link CompilerOperationResult}. * - * @typeParam TransactionContext - the type of the `TransactionContext` in - * `CompilationData` expected by this operation + * @typeParam CompilationContext - the type of the {@link CompilationContext} in + * `CompilationData` expected by this operation * @typeParam CanBeSkipped - if true, this operation may return * `CompilerOperationSkip` to indicate that it cannot be applied and should be * skipped - * @typeParam Data - the type of the `CompilationData` expected by this + * @typeParam Data - the type of the {@link CompilationData} expected by this * operation - * @typeParam Environment - the type of the `CompilationEnvironment` expected by - * this operation + * @typeParam Configuration - the type of the {@link CompilerConfiguration} + * expected by this operation * @param identifier - The full identifier used to describe this operation, e.g. * `owner.signature.all_outputs`. - * @param data - The `CompilationData` provided to the compiler - * @param environment - The `CompilationEnvironment` provided to the compiler + * @param data - The {@link CompilationData} provided to the compiler + * @param configuration - The {@link CompilerConfiguration} provided to + * the compiler */ export type CompilerOperation< - TransactionContext = unknown, + CompilationContext = unknown, CanBeSkipped extends boolean = false, - Data extends CompilationData = CompilationData< - TransactionContext - >, - Environment extends AnyCompilationEnvironment< - TransactionContext - > = CompilationEnvironment + Data extends CompilationData = CompilationData, + Configuration extends AnyCompilerConfiguration = CompilerConfiguration > = ( identifier: string, data: Data, - environment: Environment + configuration: Configuration ) => CompilerOperationResult; export type CompilerOperationsKeysCommon = 'public_key' | 'signature'; /** * Valid identifiers for full transaction signing serialization algorithms. Each - * full serialization is double-sha256 hashed to produce the digest which is + * full serialization is double-sha256 hashed to produce the digest that is * signed. */ export type CompilerOperationsSigningSerializationFull = - | 'full_all_outputs' | 'full_all_outputs_single_input' - | 'full_corresponding_output' + | 'full_all_outputs' | 'full_corresponding_output_single_input' - | 'full_no_outputs' - | 'full_no_outputs_single_input'; + | 'full_corresponding_output' + | 'full_no_outputs_single_input' + | 'full_no_outputs'; /** * Valid identifiers for components of transaction signing serializations. @@ -171,22 +167,22 @@ export type CompilerOperationsSigningSerializationFull = * "full" signing serializations. */ export type CompilerOperationsSigningSerializationComponent = - | 'version' - | 'transaction_outpoints' - | 'transaction_outpoints_hash' - | 'transaction_sequence_numbers' - | 'transaction_sequence_numbers_hash' - | 'outpoint_transaction_hash' - | 'outpoint_index' + | 'corresponding_output_hash' + | 'corresponding_output' | 'covered_bytecode_length' | 'covered_bytecode' + | 'locktime' + | 'outpoint_index' + | 'outpoint_transaction_hash' | 'output_value' | 'sequence_number' - | 'corresponding_output' - | 'corresponding_output_hash' - | 'transaction_outputs' + | 'transaction_outpoints_hash' + | 'transaction_outpoints' | 'transaction_outputs_hash' - | 'locktime'; + | 'transaction_outputs' + | 'transaction_sequence_numbers_hash' + | 'transaction_sequence_numbers' + | 'version'; /** * Valid identifiers describing the various full and partial signing @@ -197,14 +193,14 @@ export type CompilerOperationsSigningSerializationCommon = | CompilerOperationsSigningSerializationFull; /** - * The full context required to compile a given Bitauth Template script – + * The full context required to compile a given CashAssembly Template script – * everything required for the compiler to understand the CompilationData and * generate the compiled bytecode (targeting a specific - * `AuthenticationVirtualMachine`). + * {@link AuthenticationVirtualMachine}). * * @remarks - * A `CompilationEnvironment` must include a subset of the script's - * `AuthenticationTemplate` – all the variables and scripts referenced + * A {@link CompilerConfiguration} must include a subset of the script's + * {@link AuthenticationTemplate} – all the variables and scripts referenced * (including children of children) by the script in question. * * The context must also include an object mapping of opcode identifiers to the @@ -212,9 +208,9 @@ export type CompilerOperationsSigningSerializationCommon = * * If keys are used, an implementation of `sha256` and `secp256k1` is * required. If the script requires evaluations during compilation, the - * evaluating `AuthenticationVirtualMachine` must also be included. + * evaluating {@link AuthenticationVirtualMachine} must also be included. * - * @typeParam TransactionContext - additional data available to compiler + * @typeParam CompilationContext - additional data available to compiler * operations, e.g. transaction signing serialization components * @typeParam CompilerKeyOperations - a list of valid compiler operations for * `Key` and `HdKey` variables, e.g. `'public_key' | 'signature'`, or `false` if @@ -236,8 +232,8 @@ export type CompilerOperationsSigningSerializationCommon = * operations for `current_block_time` variables or `false` if only a single * compiler operation is used for all instances (default: `false`) */ -export interface CompilationEnvironment< - TransactionContext = unknown, +export interface CompilerConfiguration< + CompilationContext = unknown, CompilerKeyOperations extends string | false = CompilerOperationsKeysCommon, CompilerSigningSerializationOperations extends | string @@ -248,15 +244,18 @@ export interface CompilationEnvironment< CompilerCurrentBlockTimeOperations extends string | false = false > { /** - * A method which accepts the compiled bytecode contents of a BTL evaluation - * and produces the equivalent `AuthenticationProgram` to be evaluated by the - * VM. This method is used internally to compute BTL evaluations. See - * `createAuthenticationProgramEvaluationCommon` for details. + * A method that accepts the compiled bytecode contents of a CashAssembly + * evaluation and produces the equivalent {@link AuthenticationProgram} to be + * evaluated by the VM. This method is used internally to compute CashAssembly + * evaluations. See {@link createAuthenticationProgramEvaluationCommon} + * for details. */ - createAuthenticationProgram?: ( - evaluationBytecode: Uint8Array - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => any; + createAuthenticationProgram?: + | (( + evaluationBytecode: Uint8Array + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => any) + | undefined; /** * An object mapping template variable identifiers to the entity identifiers @@ -267,45 +266,41 @@ export interface CompilationEnvironment< * * To avoid compilation errors, this object must contain all `HdKey` variables * referenced by the script being compiled (including in child scripts). To - * enable support for error handling like `extractMissingVariables`, it's - * recommended that all variables be provided here. + * enable support for error handling like {@link extractMissingVariables}, + * it's recommended that all variables be provided here. */ - // eslint-disable-next-line functional/no-mixed-type - entityOwnership?: { - [variableId: string]: string; - }; + + entityOwnership?: { [variableId: string]: string } | undefined; /** * An object mapping the script identifiers of locking scripts to their - * locking script type, either `standard` or `p2sh`. + * locking script type, either `standard` or `p2sh20`. * * This is used to transform compilation results into the proper structure for - * P2SH locking and unlocking scripts. + * P2SH20 locking and unlocking scripts. * - * When compiling locking scripts of type `p2sh`, the result will be placed in - * a P2SH "redeemScript" format: + * When compiling locking scripts of type `p2sh20`, the result will be placed + * in a P2SH20 "redeemScript" format: * `OP_HASH160 <$( OP_HASH160)> OP_EQUAL` * - * When compiling unlocking scripts which unlock locking scripts of type - * `p2sh`, the result will be transformed into the P2SH unlocking format: + * When compiling unlocking scripts that unlock locking scripts of type + * `p2sh20`, the result will be transformed into the P2SH20 unlocking format: * `result ` (where `locking_script` is the compiled bytecode * of the locking script, without the "redeemScript" transformation.) * * By default, all scripts are assumed to have the type `standard`. */ - lockingScriptTypes?: { - [lockingScriptId: string]: 'p2sh' | 'standard'; - }; + lockingScriptTypes?: + | { [lockingScriptId: string]: 'p2sh20' | 'standard' } + | undefined; /** * An object mapping opcode identifiers to the bytecode they generate. */ - opcodes?: { - [opcodeIdentifier: string]: Uint8Array; - }; + opcodes?: { [opcodeIdentifier: string]: Uint8Array } | undefined; /** - * An object specifying the operations made available by this compilation - * environment for each variable type. For example, keys typically support + * An object specifying the operations made available by this compiler + * configuration for each variable type. For example, keys typically support * public key derivation (`.public_key`) and several signature types. * * Compiler operations can be specified as a single operation for all @@ -314,120 +309,113 @@ export interface CompilationEnvironment< * valid operation name (as is the default for `Key` and `HdKey`). */ operations?: { - hdKey?: CompilerKeyOperations extends string - ? { - [operationId in CompilerKeyOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - key?: CompilerKeyOperations extends string - ? { - [operationId in CompilerKeyOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - addressData?: CompilerAddressDataOperations extends string - ? { - [operationId in CompilerAddressDataOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - walletData?: CompilerWalletDataOperations extends string - ? { - [operationId in CompilerWalletDataOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - currentBlockHeight?: CompilerCurrentBlockHeightOperations extends string - ? { - [operationId in CompilerCurrentBlockHeightOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - currentBlockTime?: CompilerCurrentBlockTimeOperations extends string - ? { - [operationId in CompilerCurrentBlockTimeOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; - signingSerialization?: CompilerSigningSerializationOperations extends string - ? { - [operationId in CompilerSigningSerializationOperations]?: CompilerOperation< - TransactionContext - >; - } - : CompilerOperation; + hdKey?: + | (CompilerKeyOperations extends string + ? { + [operationId in CompilerKeyOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + key?: + | (CompilerKeyOperations extends string + ? { + [operationId in CompilerKeyOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + addressData?: + | (CompilerAddressDataOperations extends string + ? { + [operationId in CompilerAddressDataOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + walletData?: + | (CompilerWalletDataOperations extends string + ? { + [operationId in CompilerWalletDataOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + currentBlockHeight?: + | (CompilerCurrentBlockHeightOperations extends string + ? { + [operationId in CompilerCurrentBlockHeightOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + currentBlockTime?: + | (CompilerCurrentBlockTimeOperations extends string + ? { + [operationId in CompilerCurrentBlockTimeOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; + signingSerialization?: + | (CompilerSigningSerializationOperations extends string + ? { + [operationId in CompilerSigningSerializationOperations]?: CompilerOperation; + } + : CompilerOperation) + | undefined; }; /** - * An implementation of ripemd160 is required for any scripts which include - * `HdKey`s. This can be instantiated with `instantiateRipemd160`. + * An implementation of ripemd160 is required for any scripts that include + * `HdKey`s. This can be instantiated with {@link instantiateRipemd160}. */ - ripemd160?: { hash: Ripemd160['hash'] }; + ripemd160?: { hash: Ripemd160['hash'] } | undefined; /** * An object mapping scenario identifiers to the - * `AuthenticationTemplateScenario`s they represent. + * {@link AuthenticationTemplateScenario}s they represent. */ - scenarios?: { - [scriptId: string]: AuthenticationTemplateScenario; - }; + scenarios?: + | { [scriptId: string]: AuthenticationTemplateScenario } + | undefined; /** - * An object mapping script identifiers to the text of script in Bitauth - * Templating Language. + * An object mapping script identifiers to the text of script in CashAssembly. * * To avoid compilation errors, this object must contain all scripts * referenced by the script being compiled (including children of children). */ - scripts: { - [scriptId: string]: string; - }; + scripts: { [scriptId: string]: string }; /** - * An implementation of secp256k1 is required for any scripts which include - * signatures. This can be instantiated with `instantiateSecp256k1`. + * An implementation of secp256k1 is required for any scripts that include + * signatures. This can be instantiated with {@link instantiateSecp256k1}. */ - secp256k1?: { - addTweakPrivateKey: ( - privateKey: Uint8Array, - tweakValue: Uint8Array - ) => Uint8Array; - addTweakPublicKeyCompressed: ( - publicKey: Uint8Array, - tweakValue: Uint8Array - ) => Uint8Array; - derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; - signMessageHashSchnorr: Secp256k1['signMessageHashSchnorr']; - signMessageHashDER: Secp256k1['signMessageHashDER']; - }; + secp256k1?: + | { + addTweakPrivateKey: Secp256k1['addTweakPrivateKey']; + addTweakPublicKeyCompressed: Secp256k1['addTweakPublicKeyCompressed']; + derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; + signMessageHashSchnorr: Secp256k1['signMessageHashSchnorr']; + signMessageHashDER: Secp256k1['signMessageHashDER']; + } + | undefined; /** - * An implementation of sha256 is required for any scripts which include - * signatures. This can be instantiated with `instantiateSha256`. + * An implementation of sha256 is required for any scripts that include + * signatures. This can be instantiated with {@link instantiateSha256}. */ - sha256?: { hash: Sha256['hash'] }; + sha256?: { hash: Sha256['hash'] } | undefined; /** - * An implementation of sha512 is required for any scripts which include - * `HdKey`s. This can be instantiated with `instantiateSha512`. + * An implementation of sha512 is required for any scripts that include + * `HdKey`s. This can be instantiated with {@link instantiateSha512}. */ - sha512?: { hash: Sha512['hash'] }; + sha512?: { hash: Sha512['hash'] } | undefined; /** - * Only for use when recursively calling `compileScript` (e.g. in compiler - * operations). + * Only for use when recursively calling {@link compileScript} (e.g. in + * compiler operations). * * The "breadcrumb" path of script IDs currently being compiled, including the * current script. (E.g. `["grandparentId", "parentId", "scriptId"]`) * - * BTL identifier resolution must be acyclic. To prevent an infinite loop, - * `IdentifierResolutionFunction`s must abort resolution if they encounter - * their own `id` while resolving another identifier. Likewise, child scripts - * being resolved by a parent script may not reference any script which is - * already in the process of being resolved. + * CashAssembly identifier resolution must be acyclic. To prevent an infinite + * loop, {@link IdentifierResolutionFunction}s must abort resolution if they + * encounter their own `id` while resolving another identifier. Likewise, + * child scripts being resolved by a parent script may not reference any + * script that is already in the process of being resolved. */ - sourceScriptIds?: string[]; + sourceScriptIds?: string[] | undefined; /** * An object mapping the identifiers of unlocking scripts to the identifiers @@ -435,9 +423,7 @@ export interface CompilationEnvironment< * `coveredBytecode` used in signing serializations, and it is required for * all signature operations and many signing serialization operations. */ - unlockingScripts?: { - [unlockingScriptId: string]: string; - }; + unlockingScripts?: { [unlockingScriptId: string]: string } | undefined; /** * An object mapping the identifiers of unlocking scripts to their @@ -450,42 +436,42 @@ export interface CompilationEnvironment< * The `height` type indicates that the transaction's locktime is provided as * a block height (the `locktime` value is less than `500000000`). * - * See `AuthenticationTemplateScript.timeLockType` for details. + * See {@link AuthenticationTemplateScript.timeLockType} for details. */ - unlockingScriptTimeLockTypes?: { - [unlockingScriptId: string]: 'timestamp' | 'height'; - }; + unlockingScriptTimeLockTypes?: + | { + [unlockingScriptId: string]: 'height' | 'timestamp'; + } + | undefined; /** * An object mapping template variable identifiers to the - * `AuthenticationTemplateVariable` describing them. + * {@link AuthenticationTemplateVariable} describing them. * * To avoid compilation errors, this object must contain all variables * referenced by the script being compiled (including in child scripts). */ - variables?: { - [variableId: string]: AuthenticationTemplateVariable; - }; + variables?: + | { [variableId: string]: AuthenticationTemplateVariable } + | undefined; /** - * The AuthenticationVirtualMachine on which BTL `evaluation` results will be - * computed. + * The {@link AuthenticationVirtualMachine} on which CashAssembly `evaluation` + * results will be computed. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - vm?: AuthenticationVirtualMachine; + vm?: AuthenticationVirtualMachine | undefined; } /** * Data required at compilation time to generate the bytecode for a particular - * Bitauth Template script. + * CashAssembly Template script. */ -export interface CompilationData< - TransactionContext = TransactionContextCommon -> { +export interface CompilationData { /** * A map of full identifiers to pre-computed bytecode for this compilation. * * This is always used to provide bytecode for `AddressData` and `WalletData`, - * and it can also be used to provide public keys and signatures which have + * and it can also be used to provide public keys and signatures that have * been pre-computed by other entities (e.g. when computing these would * require access to private keys held by another entities). * @@ -494,7 +480,7 @@ export interface CompilationData< * `variable_id.signature.all_outputs`. * * To provide `AddressData` or `WalletData` from advanced user interfaces, - * consider parsing input with `compileBtl`. + * consider parsing input with `compileCashAssembly`. * * @remarks * It is security-critical that only identifiers provided by the entities @@ -502,10 +488,10 @@ export interface CompilationData< * * 1. When generating a `lockingBytecode` for a 2-of-2 wallet, a * malicious entity could provide a pre-computed value for `us.public_key` - * which is equal to `them.public_key` such that the resulting + * that is equal to `them.public_key` such that the resulting * `lockingBytecode` is entirely controlled by that entity. * - * 2. When generating an `unlockingBytecode` which includes a data signature, + * 2. When generating an `unlockingBytecode` that includes a data signature, * if a malicious entity can provide a pre-computed value for identifiers * present in the message, the malicious entity can trick the compiling entity * into signing an unintended message, e.g. creating a false attestation or @@ -516,12 +502,10 @@ export interface CompilationData< * first be evaluated only with trusted information (variables owned by or * previously validated by the compiling entity). On unsuccessful * compilations, missing variables can be extracted with - * `extractMissingVariables`, and each missing variable should be filled only - * by bytecode values provided by entities from which they were expected. + * {@link extractMissingVariables}, and each missing variable should be filled + * only by bytecode values provided by entities from which they were expected. */ - bytecode?: { - [fullIdentifier: string]: Uint8Array; - }; + bytecode?: { [fullIdentifier: string]: Uint8Array }; /** * The current block height at address creation time. */ @@ -547,15 +531,15 @@ export interface CompilationData< * the dynamic index (`i`) used in each `privateDerivationPath` or * `publicDerivationPath`. * - * This is required for any compiler operation which requires derivation. + * This is required for any compiler operation that requires derivation. * Typically, the value is incremented by one for each address in a wallet. */ addressIndex?: number; /** * A map of entity IDs to HD public keys. These HD public keys are used to * derive public keys for each `HdKey` variable assigned to that entity (as - * specified in `CompilationEnvironment.entityOwnership`) according to its - * `publicDerivationPath`. + * specified in {@link CompilerConfiguration.entityOwnership}) according to + * its `publicDerivationPath`. * * HD public keys may be encoded for either mainnet or testnet (the network * information is ignored). @@ -564,14 +548,12 @@ export interface CompilationData< * `hdPublicKeys`) are provided for the same entity in the same compilation * (not recommended), the HD private key is used. */ - hdPublicKeys?: { - [entityId: string]: string; - }; + hdPublicKeys?: { [entityId: string]: string }; /** * A map of entity IDs to master HD private keys. These master HD private * keys are used to derive each `HdKey` variable assigned to that entity (as - * specified in `CompilationEnvironment.entityOwnership`) according to its - * `privateDerivationPath`. + * specified in {@link CompilerConfiguration.entityOwnership}) according to + * its `privateDerivationPath`. * * HD private keys may be encoded for either mainnet or testnet (the network * information is ignored). @@ -580,9 +562,7 @@ export interface CompilationData< * `hdPublicKeys`) are provided for the same entity in the same compilation * (not recommended), only the HD private key is used. */ - hdPrivateKeys?: { - [entityId: string]: string; - }; + hdPrivateKeys?: { [entityId: string]: string }; }; /** * An object describing the settings used for `Key` variables in this @@ -592,98 +572,153 @@ export interface CompilationData< /** * A map of `Key` variable IDs to their private keys for this compilation. */ - privateKeys?: { - [variableId: string]: Uint8Array; - }; + privateKeys?: { [variableId: string]: Uint8Array }; }; /** - * The `TransactionContext` expected by this particular compiler for any + * The {@link CompilationContext} expected by this particular compiler for any * operations used in the compilation. */ - transactionContext?: TransactionContext; + compilationContext?: CompilationContext; } /** - * Any compilation environment, where each data type may use either a single or + * Any compiler configuration, where each data type may use either a single or * multiple operations. */ -export type AnyCompilationEnvironment< - TransactionContext -> = CompilationEnvironment< - TransactionContext, - string | false, - string | false, - string | false, - string | false, - string | false, - string | false ->; +export type AnyCompilerConfiguration = + CompilerConfiguration< + CompilationContext, + string | false, + string | false, + string | false, + string | false, + string | false, + string | false + >; /** - * Any compilation environment where the type of the `operations` value is + * Any compiler configuration where the type of the `operations` value is * irrelevant. */ -export type AnyCompilationEnvironmentIgnoreOperations< - TransactionContext = TransactionContextCommon -> = Omit, 'operations'>; +export type AnyCompilerConfigurationIgnoreOperations< + CompilationContext = CompilationContextBCH +> = Omit, 'operations'>; export type BytecodeGenerationResult = + | CompilationResultError | { bytecode: Uint8Array; success: true; - } - | CompilationResultError; + }; /** * A fully-generated authentication template scenario. Useful for estimating - * transactions and testing of authentication templates. See - * `AuthenticationTemplateScenario` for details. + * transactions and testing/debugging authentication templates. See + * {@link AuthenticationTemplateScenario} for details. */ export interface Scenario { data: CompilationData; - program: AuthenticationProgramTransactionContextCommon; + program: AuthenticationProgramCommon; } /** - * A `Compiler` is a wrapper around a specific `CompilationEnvironment` which - * exposes a purely-functional interface and allows for stronger type checking. + * A scenario generation result that includes all compilation information for + * the scripts under test (in the scenario's "slot"s). This allows + * authentication template editors to display debugging information in context. + * + * Note, scenarios can also include compilations for source outputs, inputs, and + * outputs that are not under test – while debugging information is not + * provided for these other compilations, and errors will result in `scenario` + * being set to an error message (`string`). + */ +export interface ScenarioGenerationDebuggingResult { + /** + * Either the compiled scenario or an error message describing the scenario + * generation failure. + */ + scenario: Scenario | string; + /** + * The locking script, redeem script, or virtualized locking script + * compilation result. + */ + lockingCompilation: CompilationResult; + /** + * The unlocking script or virtualized unlocking script compilation result. + * May be `undefined` if scenario generation failed prior to unlocking + * compilation (due to a failure in source output or transaction output + * compilation). + */ + unlockingCompilation?: CompilationResult; +} + +/** + * A {@link Compiler} is a wrapper around a specific + * {@link CompilerConfiguration} that exposes a purely-functional interface and + * allows for stronger type checking. */ export interface Compiler< - TransactionContext, - CompilationEnvironment, + CompilationContext, + Configuration extends AnyCompilerConfiguration, ProgramState > { - environment: CompilationEnvironment; + configuration: Configuration; /** * Generate the bytecode for the given script and compilation data. - * - * @param script - the identifer of the script to compile - * @param data - the compilation data required to compile this script - * @param debug - enable compilation debugging information (default: `false`) */ - // eslint-disable-next-line functional/no-mixed-type - generateBytecode: ( - scriptId: string, - data: CompilationData, - debug?: Debug - ) => Debug extends true + generateBytecode: ({ + data, + debug, + scriptId, + }: { + /** + * The compilation data required to compile this script + */ + data: CompilationData; + /** + * Enable compilation debugging information (default: `false`) + */ + debug?: Debug; + /** + * The identifier of the script to compile + */ + scriptId: string; + }) => Debug extends true ? CompilationResult : BytecodeGenerationResult; /** - * Generate the compilation data for a scenario specified in this compilation - * environment. Returns either the full `CompilationData` for the selected - * scenario or an error message (as a `string`). + * Generate a scenario given this compiler's configuration. * - * Note, generated compilation data always uses a `transactionContext` of type - * `TransactionContextCommon`. + * If no `scenarioId` is specified, the default scenario is used. If no + * `unlockingScriptId` is used, an empty script is used for all `["slot"]` and + * `["copy"]` locations in the generated transaction (useful for testing + * isolated scripts, i.e. scripts without either tests or any corresponding + * unlocking scripts). * - * @param scenario - the identifer of the scenario to generate + * @param scenarioId - + * @param unlockingScriptId - + * @param debug - */ - generateScenario: ({ + generateScenario: ({ + debug, scenarioId, unlockingScriptId, }: { - scenarioId?: string; - unlockingScriptId?: string; - }) => Scenario | string; + /** + * Enable compilation debugging information (default: `false`) + */ + debug?: Debug; + /** + * The identifier of the scenario to generate + */ + scenarioId?: string | undefined; + /** + * The identifier of the unlocking script to use in the scenario's input + * slot (the matching locking script will be used in the source output slot) + */ + unlockingScriptId?: string | undefined; + }) => + | string + | (Debug extends true + ? ScenarioGenerationDebuggingResult + : Scenario); } diff --git a/src/lib/compiler/compiler-utils.ts b/src/lib/compiler/compiler-utils.ts new file mode 100644 index 00000000..111e21b0 --- /dev/null +++ b/src/lib/compiler/compiler-utils.ts @@ -0,0 +1,400 @@ +import { + ripemd160 as internalRipemd160, + secp256k1 as internalSecp256k1, + sha256 as internalSha256, + sha512 as internalSha512, +} from '../crypto/default-crypto-instances.js'; +import { compileScript } from '../language/language.js'; +import type { + AnyCompilerConfiguration, + AuthenticationProgramCommon, + AuthenticationProgramStateCommon, + AuthenticationProgramStateControlStack, + AuthenticationProgramStateMinimum, + AuthenticationProgramStateStack, + AuthenticationTemplate, + BytecodeGenerationResult, + CompilationContextBCH, + CompilationData, + CompilationResult, + Compiler, + CompilerConfiguration, +} from '../lib'; +import { + generateBytecodeMap, + Opcodes, + OpcodesBCH, + OpcodesBTC, +} from '../vm/vm.js'; + +import { compilerOperationsCommon } from './compiler-operations.js'; +import { generateScenarioBCH } from './scenarios.js'; + +/** + * Create a {@link Compiler.generateBytecode} method given a compiler + * configuration. + */ +export const createCompilerGenerateBytecodeFunction = + < + CompilationContext extends CompilationContextBCH, + Configuration extends AnyCompilerConfiguration, + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + compilerConfiguration: Configuration + ) => + ({ + data, + debug, + scriptId, + }: { + scriptId: string; + data: CompilationData; + debug?: boolean; + }) => { + const result = compileScript( + scriptId, + data, + compilerConfiguration + ); + return ( + debug === true + ? result + : result.success + ? { bytecode: result.bytecode, success: true } + : { + errorType: result.errorType, + errors: result.errors, + success: false, + } + ) as Debug extends true + ? CompilationResult + : BytecodeGenerationResult; + }; + +/** + * Create a {@link Compiler} from the provided compiler configuration. This + * method requires a full {@link CompilerConfiguration} and does not provide any + * crypto or VM implementations. + * + * @param configuration - the configuration from which to create the compiler + */ +export const compilerConfigurationToCompilerBCH = < + Configuration extends AnyCompilerConfiguration, + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack +>( + configuration: Configuration +): Compiler => { + const generateBytecode = + createCompilerGenerateBytecodeFunction(configuration); + return { + configuration, + generateBytecode, + generateScenario: ({ unlockingScriptId, scenarioId, debug }) => + generateScenarioBCH( + { + configuration, + generateBytecode, + scenarioId, + unlockingScriptId, + }, + debug + ), + }; +}; + +export const compilerConfigurationToCompiler = + compilerConfigurationToCompilerBCH; + +const nullHashLength = 32; + +/** + * A common {@link createAuthenticationProgram} implementation for + * most compilers. + * + * Accepts the compiled contents of an evaluation and produces a + * {@link AuthenticationProgramCommon} that can be evaluated to produce the + * resulting program state. + * + * The precise shape of the authentication program produced by this method is + * critical to the determinism of CashAssembly evaluations for the compiler in + * which it is used, it therefore must be standardized between compiler + * implementations. + * + * @param evaluationBytecode - the compiled bytecode to incorporate in the + * created authentication program + */ +export const createAuthenticationProgramEvaluationCommon = ( + evaluationBytecode: Uint8Array +): AuthenticationProgramCommon => ({ + inputIndex: 0, + sourceOutputs: [ + { + lockingBytecode: evaluationBytecode, + valueSatoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), + }, + ], + transaction: { + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: new Uint8Array(nullHashLength), + sequenceNumber: 0, + unlockingBytecode: Uint8Array.of(), + }, + ], + locktime: 0, + outputs: [ + { + lockingBytecode: Uint8Array.of(), + valueSatoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), + }, + ], + version: 0, + }, +}); + +/** + * Create a compiler using the default common compiler configuration. Because + * this compiler has no access to a VM, it cannot compile evaluations. + * + * @param scriptsAndOverrides - a compiler configuration from which properties + * will be used to override properties of the default common compiler + * configuration – must include the `scripts` property + */ +export const createCompilerCommon = < + Configuration extends AnyCompilerConfiguration, + ProgramState extends AuthenticationProgramStateCommon +>( + scriptsAndOverrides: Configuration +): Compiler => + compilerConfigurationToCompilerBCH({ + ...{ + createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, + opcodes: generateBytecodeMap(Opcodes), + operations: compilerOperationsCommon, + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + sha512: internalSha512, + }, + ...scriptsAndOverrides, + }); + +/** + * Perform a simplified compilation on a CashAssembly script containing only hex + * literals, bigint literals, UTF8 literals, and push statements. Scripts may + * not contain variables/operations, evaluations, or opcode identifiers (use hex + * literals instead). + * + * This is useful for accepting complex user input in advanced interfaces, + * especially for `AddressData` and `WalletData`. + * + * Returns the compiled bytecode as a `Uint8Array`, or throws an error message. + * + * @param script - a simple CashAssembly script containing no variables or + * evaluations + */ +export const compileCashAssembly = (script: string) => { + const result = createCompilerCommon({ + opcodes: {}, + operations: {}, + scripts: { script }, + }).generateBytecode({ data: {}, scriptId: 'script' }); + if (result.success) { + return result.bytecode; + } + return `CashAssembly compilation error:${result.errors.reduce( + (all, { error, range }) => + `${all} [${range.startLineNumber}, ${range.startColumn}]: ${error}`, + '' + )}`; +}; + +/** + * Re-assemble a string of disassembled bytecode + * (see {@link disassembleBytecode}). + * + * @param opcodes - a mapping of opcodes to their respective Uint8Array + * representation + * @param disassembledBytecode - the disassembled bytecode to re-assemble + */ +export const assembleBytecode = ( + opcodes: Readonly<{ [opcode: string]: Uint8Array }>, + disassembledBytecode: string +) => { + const configuration = { + opcodes, + scripts: { asm: disassembledBytecode }, + }; + return createCompilerCommon< + typeof configuration, + AuthenticationProgramStateCommon + >(configuration).generateBytecode({ data: {}, scriptId: 'asm' }); +}; + +/** + * Re-assemble a string of disassembled BCH bytecode; see + * {@link disassembleBytecodeBCH}. + * + * Note, this method performs automatic minimization of push instructions. + * + * @param disassembledBytecode - the disassembled BCH bytecode to re-assemble + */ +export const assembleBytecodeBCH = (disassembledBytecode: string) => + assembleBytecode(generateBytecodeMap(OpcodesBCH), disassembledBytecode); + +/** + * A convenience method to compile CashAssembly (using + * {@link assembleBytecodeBCH}) to bytecode. If compilation fails, errors are + * returned as a string. + */ +export const cashAssemblyToBin = (cashAssemblyScript: string) => { + const result = assembleBytecodeBCH(cashAssemblyScript); + return result.success + ? result.bytecode + : `CashAssembly compilation ${result.errorType} error: ${result.errors + .map((err) => err.error) + .join(' ')}`; +}; + +/** + * Re-assemble a string of disassembled BCH bytecode; see + * {@link disassembleBytecodeBTC}. + * + * Note, this method performs automatic minimization of push instructions. + * + * @param disassembledBytecode - the disassembled BTC bytecode to re-assemble + */ +export const assembleBytecodeBTC = (disassembledBytecode: string) => + assembleBytecode(generateBytecodeMap(OpcodesBTC), disassembledBytecode); + +/** + * Create a partial {@link CompilerConfiguration} from an + * {@link AuthenticationTemplate} by extracting and formatting the `scripts` and + * `variables` properties. + * + * Note, if this {@link AuthenticationTemplate} might be malformed, first + * validate it with {@link importAuthenticationTemplate}. + * + * @param template - the {@link AuthenticationTemplate} from which to extract + * the compiler configuration + */ +export const authenticationTemplateToCompilerConfiguration = ( + template: AuthenticationTemplate +): Pick< + CompilerConfiguration, + | 'entityOwnership' + | 'lockingScriptTypes' + | 'scenarios' + | 'scripts' + | 'unlockingScripts' + | 'unlockingScriptTimeLockTypes' + | 'variables' +> => { + /** + * Template scripts including virtualized test scripts. + */ + const virtualizedScripts: AuthenticationTemplate['scripts'] = Object.entries( + template.scripts + ).reduce((all, [scriptId, script]) => { + if ('tests' in script) { + return { + ...all, + ...Object.entries(script.tests).reduce< + AuthenticationTemplate['scripts'] + >((tests, [testId, test]) => { + const pushTestedScript = script.pushed === true; + const checkScriptId = `${scriptId}.${testId}.check`; + const virtualizedLockingScriptId = `${scriptId}.${testId}.lock`; + const virtualizedUnlockingScriptId = `${scriptId}.${testId}.unlock`; + return { + ...tests, + [checkScriptId]: { script: test.check }, + [virtualizedLockingScriptId]: { + script: pushTestedScript + ? `<${scriptId}> ${checkScriptId}` + : `${scriptId} ${checkScriptId}`, + }, + [virtualizedUnlockingScriptId]: { + script: test.setup ?? '', + unlocks: virtualizedLockingScriptId, + }, + }; + }, {}), + }; + } + return all; + }, {}); + const allScripts = { + ...template.scripts, + ...virtualizedScripts, + }; + const scripts = Object.entries(allScripts).reduce< + CompilerConfiguration['scripts'] + >((all, [id, def]) => ({ ...all, [id]: def.script }), {}); + const variables = Object.values(template.entities).reduce< + CompilerConfiguration['variables'] + >((all, entity) => ({ ...all, ...entity.variables }), {}); + const entityOwnership = Object.entries(template.entities).reduce< + CompilerConfiguration['entityOwnership'] + >( + (all, [entityId, entity]) => ({ + ...all, + ...Object.keys(entity.variables ?? {}).reduce( + (entityVariables, variableId) => ({ + ...entityVariables, + [variableId]: entityId, + }), + {} + ), + }), + {} + ); + const unlockingScripts = Object.entries(allScripts).reduce< + CompilerConfiguration['unlockingScripts'] + >( + (all, [id, def]) => + 'unlocks' in def && (def.unlocks as string | undefined) !== undefined + ? { ...all, [id]: def.unlocks } + : all, + {} + ); + const unlockingScriptTimeLockTypes = Object.entries(allScripts).reduce< + CompilerConfiguration['unlockingScriptTimeLockTypes'] + >( + (all, [id, def]) => + 'timeLockType' in def && def.timeLockType !== undefined + ? { ...all, [id]: def.timeLockType } + : all, + {} + ); + const lockingScriptTypes = Object.entries(allScripts).reduce< + CompilerConfiguration['lockingScriptTypes'] + >( + (all, [id, def]) => + 'lockingType' in def && + (def.lockingType as string | undefined) !== undefined + ? { ...all, [id]: def.lockingType } + : all, + {} + ); + const scenarios = + template.scenarios === undefined + ? undefined + : Object.entries(template.scenarios).reduce< + CompilerConfiguration['scenarios'] + >((all, [id, def]) => ({ ...all, [id]: def }), {}); + return { + entityOwnership, + lockingScriptTypes, + ...(scenarios === undefined ? {} : { scenarios }), + scripts, + unlockingScriptTimeLockTypes, + unlockingScripts, + variables, + }; +}; diff --git a/src/lib/compiler/compiler.spec.ts b/src/lib/compiler/compiler.spec.ts new file mode 100644 index 00000000..27f8a31f --- /dev/null +++ b/src/lib/compiler/compiler.spec.ts @@ -0,0 +1,168 @@ +/* eslint-disable camelcase */ +import test from 'ava'; + +import type { AuthenticationTemplate } from '../lib'; +import { + authenticationTemplateP2pkh, + authenticationTemplateP2pkhNonHd, + authenticationTemplateToCompilerConfiguration, + createCompilerCommon, + hexToBin, + stringify, + stringifyTestVector, +} from '../lib.js'; + +test('createCompilerCommon', (t) => { + const compiler = createCompilerCommon({ + scripts: { + lock: 'OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG', + }, + variables: { + some_public_key: { + type: 'AddressData', + }, + }, + }); + const resultLock = compiler.generateBytecode({ + data: { + bytecode: { + some_public_key: hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'), + }, + }, + scriptId: 'lock', + }); + t.deepEqual(resultLock, { + bytecode: hexToBin('76a91415d16c84669ab46059313bf0747e781f1d13936d88ac'), + success: true, + }); +}); + +test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkhNonHd', (t) => { + const configuration = authenticationTemplateToCompilerConfiguration( + authenticationTemplateP2pkhNonHd + ); + t.deepEqual( + configuration, + { + entityOwnership: { + key: 'owner', + }, + lockingScriptTypes: { + lock: 'standard', + }, + scripts: { + lock: 'OP_DUP\nOP_HASH160 <$( OP_HASH160\n)> OP_EQUALVERIFY\nOP_CHECKSIG', + unlock: '\n', + }, + unlockingScriptTimeLockTypes: {}, + unlockingScripts: { + unlock: 'lock', + }, + variables: { + key: { + description: 'The private key that controls this wallet.', + name: 'Key', + type: 'Key', + }, + }, + }, + stringify(configuration) + ); +}); + +test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh', (t) => { + const configuration = authenticationTemplateToCompilerConfiguration( + authenticationTemplateP2pkh + ); + t.deepEqual( + configuration, + { + entityOwnership: { + key: 'owner', + }, + lockingScriptTypes: { + lock: 'standard', + }, + scripts: { + lock: 'OP_DUP\nOP_HASH160 <$( OP_HASH160\n)> OP_EQUALVERIFY\nOP_CHECKSIG', + unlock: '\n', + }, + unlockingScriptTimeLockTypes: {}, + unlockingScripts: { + unlock: 'lock', + }, + variables: { + key: { + description: 'The private key that controls this wallet.', + name: 'Key', + type: 'HdKey', + }, + }, + }, + stringify(configuration) + ); +}); + +test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => { + const configuration = authenticationTemplateToCompilerConfiguration({ + entities: {}, + scripts: { + add_two: { + script: '<2> OP_ADD', + tests: [ + { check: '<3> OP_EQUAL', setup: '<1>' }, + { check: '<4> OP_EQUAL', setup: '<2>' }, + ], + }, + message: { + pushed: true, + script: '"abc"', + tests: [{ check: '<"abc"> OP_EQUAL' }], + }, + push_three: { + script: '<3>', + tests: [{ check: '<3> OP_EQUAL' }], + }, + unrelated: { + script: '<1>', + }, + }, + supported: ['BCH_2019_05'], + version: 0, + } as AuthenticationTemplate); + + t.deepEqual( + configuration, + { + entityOwnership: {}, + lockingScriptTypes: {}, + scripts: { + add_two: '<2> OP_ADD', + 'add_two.0.check': '<3> OP_EQUAL', + 'add_two.0.lock': 'add_two add_two.0.check', + 'add_two.0.unlock': '<1>', + 'add_two.1.check': '<4> OP_EQUAL', + 'add_two.1.lock': 'add_two add_two.1.check', + 'add_two.1.unlock': '<2>', + message: '"abc"', + 'message.0.check': '<"abc"> OP_EQUAL', + 'message.0.lock': ' message.0.check', + 'message.0.unlock': '', + push_three: '<3>', + 'push_three.0.check': '<3> OP_EQUAL', + 'push_three.0.lock': 'push_three push_three.0.check', + 'push_three.0.unlock': '', + unrelated: '<1>', + }, + unlockingScriptTimeLockTypes: {}, + unlockingScripts: { + 'add_two.0.unlock': 'add_two.0.lock', + 'add_two.1.unlock': 'add_two.1.lock', + 'message.0.unlock': 'message.0.lock', + 'push_three.0.unlock': 'push_three.0.lock', + }, + variables: {}, + }, + stringifyTestVector(configuration) + ); +}); diff --git a/src/lib/compiler/compiler.ts b/src/lib/compiler/compiler.ts new file mode 100644 index 00000000..e42ebddf --- /dev/null +++ b/src/lib/compiler/compiler.ts @@ -0,0 +1,9 @@ +export * from './compiler-bch/compiler-bch.js'; +export * from './compiler-defaults.js'; +export * from './compiler-operation-helpers.js'; +export * from './compiler-operations.js'; +export * from './compiler-types.js'; +export * from './compiler-utils.js'; +export * from './scenarios.js'; +export * from './standard/standard.js'; +export * from './template-types.js'; diff --git a/src/lib/template/scenarios.spec.ts b/src/lib/compiler/scenarios.spec.ts similarity index 75% rename from src/lib/template/scenarios.spec.ts rename to src/lib/compiler/scenarios.spec.ts index c03e9099..d9daf541 100644 --- a/src/lib/template/scenarios.spec.ts +++ b/src/lib/compiler/scenarios.spec.ts @@ -1,41 +1,31 @@ -/* eslint-disable functional/no-expression-statement, camelcase, max-lines, @typescript-eslint/naming-convention */ -import test, { Macro } from 'ava'; +/* eslint-disable camelcase, max-lines */ +import test from 'ava'; -import { - AuthenticationProgramStateBCH, +import type { AuthenticationTemplate, + ExtendedScenarioDefinition, + PartialExactOptional, + Scenario, +} from '../lib'; +import { authenticationTemplateP2pkh, authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilationEnvironment, authenticationTemplateToCompilerBCH, - CompilationEnvironmentBCH, - compilerOperationsBCH, - createAuthenticationProgramEvaluationCommon, - createCompiler, - ExtendedScenarioDefinition, + authenticationTemplateToCompilerConfiguration, extendedScenarioDefinitionToCompilationData, extendScenarioDefinition, extendScenarioDefinitionData, - generateBytecodeMap, generateDefaultScenarioDefinition, generateExtendedScenario, hexToBin, - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha256, - instantiateSha512, - instantiateVirtualMachineBCH, - instructionSetBCHCurrentStrict, - OpcodesBCH, - Scenario, + importAuthenticationTemplate, + sha256, + sha512, stringifyTestVector, - TransactionContextBCH, - validateAuthenticationTemplate, -} from '../lib'; -import { cashChannelsJson } from '../transaction/transaction-e2e.spec.helper'; +} from '../lib.js'; +import { cashChannelsJson } from '../transaction/transaction-e2e.spec.helper.js'; -const sha256Promise = instantiateSha256(); -const sha512Promise = instantiateSha512(); +import { createCompilerBCH } from './compiler.js'; test('generateDefaultScenarioDefinition: empty', (t) => { const scenario = generateDefaultScenarioDefinition({ scripts: {} }); @@ -46,34 +36,37 @@ test('generateDefaultScenarioDefinition: empty', (t) => { currentBlockHeight: 2, currentBlockTime: 1231469665, }, + sourceOutputs: [ + { + lockingBytecode: ['slot'], + }, + ], transaction: { inputs: [ { - unlockingBytecode: null, + unlockingBytecode: ['slot'], }, ], locktime: 0, outputs: [ { - lockingBytecode: '', + lockingBytecode: {}, }, ], version: 2, }, - value: 0, }, stringifyTestVector(scenario) ); }); -test('generateDefaultScenarioDefinition: missing sha256', async (t) => { - const sha512 = await sha512Promise; +test('generateDefaultScenarioDefinition: missing sha256', (t) => { const scenario = generateDefaultScenarioDefinition({ scripts: {}, sha512, variables: { key: { - description: 'The private key which controls this wallet.', + description: 'The private key that controls this wallet.', name: 'Key', type: 'HdKey', }, @@ -81,19 +74,18 @@ test('generateDefaultScenarioDefinition: missing sha256', async (t) => { }); t.deepEqual( scenario, - 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compilation environment.', + 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compiler configuration.', stringifyTestVector(scenario) ); }); -test('generateDefaultScenarioDefinition: missing sha512', async (t) => { - const sha256 = await sha256Promise; +test('generateDefaultScenarioDefinition: missing sha512', (t) => { const scenario = generateDefaultScenarioDefinition({ scripts: {}, sha256, variables: { key: { - description: 'The private key which controls this wallet.', + description: 'The private key that controls this wallet.', name: 'Key', type: 'HdKey', }, @@ -101,7 +93,7 @@ test('generateDefaultScenarioDefinition: missing sha512', async (t) => { }); t.deepEqual( scenario, - 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compilation environment.', + 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compiler configuration.', stringifyTestVector(scenario) ); }); @@ -143,21 +135,25 @@ test('extendScenarioDefinition: default', (t) => { currentBlockHeight: 2, currentBlockTime: 1231469665, }, + sourceOutputs: [ + { + lockingBytecode: ['slot'], + }, + ], transaction: { inputs: [ { - unlockingBytecode: null, + unlockingBytecode: ['slot'], }, ], locktime: 0, outputs: [ { - lockingBytecode: '', + lockingBytecode: {}, }, ], version: 2, }, - value: 0, }, stringifyTestVector(extended) ); @@ -166,10 +162,16 @@ test('extendScenarioDefinition: default', (t) => { test('extendScenarioDefinition: complex extend', (t) => { const extended = extendScenarioDefinition( { + sourceOutputs: [ + { + lockingBytecode: '', + valueSatoshis: 'ffffffffffffffff', + }, + ], transaction: { inputs: [ { - unlockingBytecode: null, + unlockingBytecode: ['slot'], }, ], locktime: 0, @@ -180,7 +182,6 @@ test('extendScenarioDefinition: complex extend', (t) => { ], version: 2, }, - value: 'ffffffffffffffff', }, { data: { @@ -227,10 +228,16 @@ test('extendScenarioDefinition: complex extend', (t) => { }, }, }, + sourceOutputs: [ + { + lockingBytecode: '', + valueSatoshis: 'ffffffffffffffff', + }, + ], transaction: { inputs: [ { - unlockingBytecode: null, + unlockingBytecode: ['slot'], }, ], locktime: 0, @@ -241,7 +248,6 @@ test('extendScenarioDefinition: complex extend', (t) => { ], version: 2, }, - value: 'ffffffffffffffff', }, stringifyTestVector(extended) ); @@ -275,7 +281,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { currentBlockHeight: 2, currentBlockTime: 1231469665, }, - value: 'ffffffffffffffff', + sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], } ); t.deepEqual( @@ -302,7 +308,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { }, }, }, - value: 'ffffffffffffffff', + sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], }, stringifyTestVector(extended) ); @@ -310,12 +316,12 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { test('generateExtendedScenario: unknown scenario identifier', (t) => { const extended = generateExtendedScenario({ - environment: { scripts: {} }, + configuration: { scripts: {} }, scenarioId: 'unknown', }); t.deepEqual( extended, - 'Cannot extend scenario "unknown": a scenario with the identifier unknown is not included in this compilation environment.', + 'Cannot extend scenario "unknown": a scenario with the identifier unknown is not included in this compiler configuration.', stringifyTestVector(extended) ); }); @@ -333,10 +339,10 @@ test('extendedScenarioDefinitionToCompilationData: empty hdKeys', (t) => { }); test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) => { - const environment = authenticationTemplateToCompilationEnvironment( + const configuration = authenticationTemplateToCompilerConfiguration( authenticationTemplateP2pkhNonHd ); - const scenario = generateDefaultScenarioDefinition(environment); + const scenario = generateDefaultScenarioDefinition(configuration); t.deepEqual( scenario, @@ -346,42 +352,31 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) currentBlockTime: 1231469665, keys: { privateKeys: { - key: - '0000000000000000000000000000000000000000000000000000000000000001', + key: '0000000000000000000000000000000000000000000000000000000000000001', }, }, }, + sourceOutputs: [{ lockingBytecode: ['slot'] }], transaction: { - inputs: [ - { - unlockingBytecode: null, - }, - ], + inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [ - { - lockingBytecode: '', - }, - ], + outputs: [{ lockingBytecode: {} }], version: 2, }, - value: 0, }, stringifyTestVector(scenario) ); }); -test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', async (t) => { - const sha256 = await sha256Promise; - const sha512 = await sha512Promise; - const environment = { - ...authenticationTemplateToCompilationEnvironment( +test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', (t) => { + const configuration = { + ...authenticationTemplateToCompilerConfiguration( authenticationTemplateP2pkh ), sha256, sha512, }; - const scenario = generateDefaultScenarioDefinition(environment); + const scenario = generateDefaultScenarioDefinition(configuration); t.deepEqual( scenario, { @@ -396,110 +391,86 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', async (t) }, }, }, + sourceOutputs: [{ lockingBytecode: ['slot'] }], transaction: { - inputs: [ - { - unlockingBytecode: null, - }, - ], + inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [ - { - lockingBytecode: '', - }, - ], + outputs: [{ lockingBytecode: {} }], version: 2, }, - value: 0, }, stringifyTestVector(scenario) ); }); -const ripemd160Promise = instantiateRipemd160(); -const secp256k1Promise = instantiateSecp256k1(); -const vmPromise = instantiateVirtualMachineBCH(instructionSetBCHCurrentStrict); - -/** - * Uses `createCompiler` rather than `createCompilerBCH` for performance. - */ -export const expectScenarioGenerationResult: Macro<[ - string | undefined, - string | undefined, - Partial, - string | Scenario, - Partial>? -]> = async ( - t, - scenarioId, - unlockingScriptId, - templateOverrides, - expectedResult, - environmentOverrides - // eslint-disable-next-line max-params -) => { - const ripemd160 = await ripemd160Promise; - const sha256 = await sha256Promise; - const sha512 = await sha512Promise; - const secp256k1 = await secp256k1Promise; - const vm = await vmPromise; - - const environment = authenticationTemplateToCompilationEnvironment({ - ...{ - entities: { - owner: { - variables: { - another: { type: 'Key' }, - key1: { type: 'HdKey' }, - var1: { type: 'AddressData' }, +export const expectScenarioGenerationResult = test.macro< + [ + string | undefined, + string | undefined, + PartialExactOptional, + Scenario | string, + PartialExactOptional< + ReturnType + >? + ] +>( + ( + t, + scenarioId, + unlockingScriptId, + templateOverrides, + expectedResult, + configurationOverrides + // eslint-disable-next-line max-params + ) => { + const configuration = authenticationTemplateToCompilerConfiguration({ + ...{ + entities: { + owner: { + variables: { + another: { type: 'Key' }, + key1: { type: 'HdKey' }, + var1: { type: 'AddressData' }, + }, }, }, - }, - scripts: { - lock: { - lockingType: 'standard', - script: ' OP_DROP OP_DROP OP_1', - }, - unlock: { - script: '', - unlocks: 'lock', + scripts: { + lock: { + lockingType: 'standard', + script: ' OP_DROP OP_DROP OP_1', + }, + unlock: { + script: '', + unlocks: 'lock', + }, }, + supported: ['BCH_2020_05'], + version: 0, }, - supported: ['BCH_2020_05'], - version: 0, - }, - ...templateOverrides, - }); - const compiler = createCompiler< - TransactionContextBCH, - CompilationEnvironmentBCH, - OpcodesBCH, - AuthenticationProgramStateBCH - >({ - ...{ - createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - opcodes: generateBytecodeMap(OpcodesBCH), - operations: compilerOperationsBCH, - ripemd160, - secp256k1, - sha256, - sha512, - vm, - }, - ...environment, - ...environmentOverrides, - }); + ...templateOverrides, + } as AuthenticationTemplate); - const scenario = compiler.generateScenario({ scenarioId, unlockingScriptId }); + const compiler = createCompilerBCH({ + ...configuration, + ...(configurationOverrides as Partial< + ReturnType + >), + }); - t.deepEqual( - scenario, - expectedResult, - `– \nResult: ${stringifyTestVector( - scenario - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` - ); -}; + const scenario = compiler.generateScenario({ + scenarioId, + unlockingScriptId, + }); + + t.deepEqual( + scenario, + expectedResult, + `– \nResult: ${stringifyTestVector( + scenario + )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + ); + } +); test( 'generateScenario: deep extend', @@ -553,10 +524,13 @@ test( }, program: { inputIndex: 0, - sourceOutput: { - satoshis: hexToBin('0000000000000000'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: hexToBin('03010203757551'), + valueSatoshis: hexToBin('0000000000000000'), + }, + ], + transaction: { inputs: [ { outpointIndex: 0, @@ -564,14 +538,16 @@ test( '0000000000000000000000000000000000000000000000000000000000000000' ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin( + '4130389ff5dbd624dae23cc61e74dbdf51ac34952a2ab1591fc1266e7bb0cc4d232c885b7b181cb9a2996e490895e0297e88c808c7bad8eb2c74bc4ba71f9f759b41' + ), }, ], locktime: 0, outputs: [ { - lockingBytecode: hexToBin(''), - satoshis: hexToBin('0000000000000000'), + lockingBytecode: hexToBin('03010203757551'), + valueSatoshis: hexToBin('0000000000000000'), }, ], version: 2, @@ -601,7 +577,7 @@ test( 'does_not_exist', 'unlock', { scenarios: undefined }, - 'Cannot generate scenario "does_not_exist": a scenario with the identifier does_not_exist is not included in this compilation environment.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' ); test( @@ -612,10 +588,10 @@ test( { scenarios: { another: {} }, }, - 'Cannot generate scenario "does_not_exist": a scenario with the identifier does_not_exist is not included in this compilation environment.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' ); -test( +test.failing( 'generateScenario: invalid bytecode value', expectScenarioGenerationResult, 'a', @@ -628,7 +604,7 @@ test( 'Cannot generate scenario "a": Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "invalid".' ); -test( +test.failing( 'generateScenario: no scenario ID', expectScenarioGenerationResult, undefined, @@ -659,10 +635,13 @@ test( }, program: { inputIndex: 0, - sourceOutput: { - satoshis: hexToBin('0000000000000000'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: hexToBin(''), + valueSatoshis: hexToBin('0000000000000000'), + }, + ], + transaction: { inputs: [ { outpointIndex: 0, @@ -670,14 +649,14 @@ test( '0000000000000000000000000000000000000000000000000000000000000000' ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin(''), }, ], locktime: 0, outputs: [ { lockingBytecode: hexToBin(''), - satoshis: hexToBin('0000000000000000'), + valueSatoshis: hexToBin('0000000000000000'), }, ], version: 2, @@ -713,10 +692,13 @@ test( }, program: { inputIndex: 0, - sourceOutput: { - satoshis: hexToBin('0000000000000000'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: hexToBin(''), + valueSatoshis: hexToBin('0000000000000000'), + }, + ], + transaction: { inputs: [ { outpointIndex: 0, @@ -724,14 +706,14 @@ test( '0000000000000000000000000000000000000000000000000000000000000000' ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin(''), }, ], locktime: 0, outputs: [ { lockingBytecode: hexToBin(''), - satoshis: hexToBin('0000000000000000'), + valueSatoshis: hexToBin('0000000000000000'), }, ], version: 2, @@ -740,7 +722,7 @@ test( } ); -test( +test.failing( 'generateScenario: unknown locking bytecode script', expectScenarioGenerationResult, 'a', @@ -750,10 +732,10 @@ test( a: { transaction: { inputs: [{}, {}] } }, }, }, - 'Cannot generate scenario "a": the specific input under test in this scenario is ambiguous – "transaction.inputs" must include exactly one input which has "unlockingBytecode" set to "null".' + 'Cannot generate scenario "a": the specific input under test in this scenario is ambiguous – "transaction.inputs" must include exactly one input that has "unlockingBytecode" set to "null".' ); -test( +test.failing( 'generateScenario: ambiguous input under test', expectScenarioGenerationResult, 'a', @@ -765,10 +747,10 @@ test( }, }, }, - 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: [0, 0] No script with an ID of "unknown" was provided in the compilation environment.' + 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: [0, 0] No script with an ID of "unknown" was provided in the compiler configuration.' ); -test( +test.failing( 'generateScenario: no locking script', expectScenarioGenerationResult, 'a', @@ -780,13 +762,13 @@ test( }, }, }, - 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: the locking script unlocked by "unlock" is not provided in this compilation environment.', + 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: the locking script unlocked by "unlock" is not provided in this compiler configuration.', { unlockingScripts: undefined, } ); -test( +test.failing( 'generateScenario: no locking script, no specified unlocking script', expectScenarioGenerationResult, 'a', @@ -804,7 +786,7 @@ test( } ); -test( +test.failing( 'generateScenario: simple transaction, locking bytecode override', expectScenarioGenerationResult, 'a', @@ -822,20 +804,20 @@ test( }, }, }, + sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], transaction: { outputs: [ { lockingBytecode: { overrides: { currentBlockHeight: 9 } }, - satoshis: 'ffffffffffffffff', + valueSatoshis: 'ffffffffffffffff', }, { lockingBytecode: { overrides: {} }, - satoshis: 'ffffffffffffffff', + valueSatoshis: 'ffffffffffffffff', }, ], version: 3, }, - value: 'ffffffffffffffff', }, }, scripts: { @@ -871,10 +853,13 @@ test( }, program: { inputIndex: 0, - sourceOutput: { - satoshis: hexToBin('ffffffffffffffff'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: hexToBin(''), + valueSatoshis: hexToBin('ffffffffffffffff'), + }, + ], + transaction: { inputs: [ { outpointIndex: 0, @@ -882,18 +867,18 @@ test( '0000000000000000000000000000000000000000000000000000000000000000' ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin(''), }, ], locktime: 0, outputs: [ { lockingBytecode: hexToBin('75597551'), - satoshis: hexToBin('ffffffffffffffff'), + valueSatoshis: hexToBin('ffffffffffffffff'), }, { lockingBytecode: hexToBin('75557551'), - satoshis: hexToBin('ffffffffffffffff'), + valueSatoshis: hexToBin('ffffffffffffffff'), }, ], version: 3, @@ -902,7 +887,7 @@ test( } ); -test( +test.failing( 'generateScenario: complex transaction, locking bytecode variable override', expectScenarioGenerationResult, 'a', @@ -920,13 +905,13 @@ test( sequenceNumber: 1, unlockingBytecode: 'beef', }, - { unlockingBytecode: null }, + { unlockingBytecode: ['slot'] }, ], locktime: 4294967295, outputs: [ { lockingBytecode: {}, - satoshis: 1000, + valueSatoshis: 1000, }, { lockingBytecode: { @@ -937,7 +922,7 @@ test( lockingBytecode: { overrides: { bytecode: { var1: '0x030405' } }, }, - satoshis: 'ffffffffffffffff', + valueSatoshis: 'ffffffffffffffff', }, ], version: 3, @@ -969,10 +954,13 @@ test( }, program: { inputIndex: 1, - sourceOutput: { - satoshis: hexToBin('0000000000000000'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: hexToBin(''), + valueSatoshis: hexToBin('0000000000000000'), + }, + ], + transaction: { inputs: [ { outpointIndex: 1, @@ -988,22 +976,22 @@ test( '0000000000000000000000000000000000000000000000000000000000000000' ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin(''), }, ], locktime: 4294967295, outputs: [ { lockingBytecode: hexToBin('03010203757551'), - satoshis: hexToBin('e803000000000000'), + valueSatoshis: hexToBin('e803000000000000'), }, { lockingBytecode: hexToBin('03010203757551'), - satoshis: hexToBin('0000000000000000'), + valueSatoshis: hexToBin('0000000000000000'), }, { lockingBytecode: hexToBin('03030405757551'), - satoshis: hexToBin('ffffffffffffffff'), + valueSatoshis: hexToBin('ffffffffffffffff'), }, ], version: 3, @@ -1012,7 +1000,7 @@ test( } ); -test( +test.failing( 'generateScenario: locking bytecode generation failure', expectScenarioGenerationResult, 'a', @@ -1033,13 +1021,13 @@ test( 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "broken".' ); -test('generateScenario: cash-channels – after_payment_time', async (t) => { - const template = validateAuthenticationTemplate(cashChannelsJson); +test.failing('generateScenario: cash-channels – after_payment_time', (t) => { + const template = importAuthenticationTemplate(cashChannelsJson); if (typeof template === 'string') { t.fail(template); return; } - const compiler = await authenticationTemplateToCompilerBCH(template); + const compiler = authenticationTemplateToCompilerBCH(template); const scenario = compiler.generateScenario({ scenarioId: 'after_payment_time', unlockingScriptId: 'execute_authorization', @@ -1077,10 +1065,13 @@ test('generateScenario: cash-channels – after_payment_time', async (t) => { }, program: { inputIndex: 0, - sourceOutput: { - satoshis: hexToBin('204e000000000000'), - }, - spendingTransaction: { + sourceOutputs: [ + { + lockingBytecode: undefined, + valueSatoshis: hexToBin('204e000000000000'), + }, + ], + transaction: { inputs: [ { outpointIndex: 0, @@ -1097,7 +1088,7 @@ test('generateScenario: cash-channels – after_payment_time', async (t) => { lockingBytecode: hexToBin( 'a9149a97dc2531b9b9af6319aab57ea369284289998987' ), - satoshis: hexToBin('1027000000000000'), + valueSatoshis: hexToBin('1027000000000000'), }, ], version: 2, diff --git a/src/lib/compiler/scenarios.ts b/src/lib/compiler/scenarios.ts new file mode 100644 index 00000000..e50909ec --- /dev/null +++ b/src/lib/compiler/scenarios.ts @@ -0,0 +1,1018 @@ +/* eslint-disable max-lines */ +import { + bigIntToBinUint256BEClamped, + bigIntToBinUint64LE, + binToHex, + hexToBin, +} from '../format/format.js'; +import { deriveHdPrivateNodeFromSeed, encodeHdPrivateKey } from '../key/key.js'; +import { compileScriptRaw, stringifyErrors } from '../language/language.js'; +import type { + AnyCompilerConfigurationIgnoreOperations, + AuthenticationTemplateKey, + AuthenticationTemplateScenario, + AuthenticationTemplateScenarioBytecode, + AuthenticationTemplateScenarioData, + AuthenticationTemplateScenarioOutput, + CompilationContextBCH, + CompilationData, + CompilationError, + CompilationResult, + CompilationResultSuccess, + Compiler, + Scenario, + ScenarioGenerationDebuggingResult, +} from '../lib'; + +import { CompilerDefaults } from './compiler-defaults.js'; + +/** + * The default `lockingBytecode` value for scenario outputs is a new empty + * object (`{}`). + */ +const defaultScenarioOutputLockingBytecode = () => ({}); + +/** + * The contents of an {@link AuthenticationTemplateScenario} without the `name` + * and `description`. + */ +export type ScenarioDefinition = Pick< + AuthenticationTemplateScenario, + 'data' | 'sourceOutputs' | 'transaction' +>; + +type RequiredTwoLevels = { + [P in keyof T]-?: Required; +}; + +/** + * A scenario definition produced when a child scenario `extends` a parent + * scenario; this "extended" scenario definition is the same as the parent + * scenario definition, but any properties defined in the child scenario + * definition replace those found in the parent scenario definition. + * + * All scenarios extend the default scenario, so the `data`, `transaction` (and + * all `transaction` properties), and `sourceOutputs` properties are guaranteed + * to be defined in any extended scenario definition. + */ +export type ExtendedScenarioDefinition = Required< + Pick +> & + Required> & + RequiredTwoLevels>; + +/** + * Given a compiler configuration, generate the default scenario that is + * extended by all the configuration's scenarios. + * + * For details on default scenario generation, see + * {@link AuthenticationTemplateScenario.extends}. + * + * @param configuration - the compiler configuration from which to generate the + * default scenario + */ +// eslint-disable-next-line complexity +export const generateDefaultScenarioDefinition = < + Configuration extends AnyCompilerConfigurationIgnoreOperations, + CompilationContext +>( + configuration: Configuration +): ExtendedScenarioDefinition | string => { + const { variables, entityOwnership } = configuration; + + const keyVariableIds = + variables === undefined + ? [] + : Object.entries(variables) + .filter( + (entry): entry is [string, AuthenticationTemplateKey] => + entry[1].type === 'Key' + ) + .map(([id]) => id); + + const entityIds = + entityOwnership === undefined + ? [] + : Object.keys( + Object.values(entityOwnership).reduce( + (all, entityId) => ({ ...all, [entityId]: true }), + {} + ) + ); + + const valueMap = [...keyVariableIds, ...entityIds] + .sort((idA, idB) => idA.localeCompare(idB, 'en')) + .reduce<{ [variableOrEntityId: string]: Uint8Array }>( + (all, id, index) => ({ + ...all, + [id]: bigIntToBinUint256BEClamped(BigInt(index + 1)), + }), + {} + ); + + const privateKeys = + variables === undefined + ? undefined + : Object.entries(variables).reduce<{ [id: string]: string }>( + (all, [variableId, variable]) => + variable.type === 'Key' + ? { + ...all, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + [variableId]: binToHex(valueMap[variableId]!), + } + : all, + {} + ); + + const defaultScenario: ExtendedScenarioDefinition = { + data: { + currentBlockHeight: + CompilerDefaults.defaultScenarioCurrentBlockHeight as const, + currentBlockTime: + CompilerDefaults.defaultScenarioCurrentBlockTime as const, + ...(privateKeys === undefined || Object.keys(privateKeys).length === 0 + ? {} + : { keys: { privateKeys } }), + }, + sourceOutputs: [{ lockingBytecode: ['slot'] }], + transaction: { + inputs: [{ unlockingBytecode: ['slot'] }], + locktime: CompilerDefaults.defaultScenarioTransactionLocktime as const, + outputs: [{ lockingBytecode: defaultScenarioOutputLockingBytecode() }], + version: CompilerDefaults.defaultScenarioTransactionVersion as const, + }, + }; + + const hasHdKeys = + variables === undefined + ? false + : Object.values(variables).findIndex( + (variable) => variable.type === 'HdKey' + ) !== -1; + + if (!hasHdKeys) { + return defaultScenario; + } + + const { sha256, sha512 } = configuration; + if (sha256 === undefined) { + return 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compiler configuration.'; + } + if (sha512 === undefined) { + return 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compiler configuration.'; + } + const crypto = { sha256, sha512 }; + + const hdPrivateKeys = entityIds.reduce((all, entityId) => { + /** + * The first 5,000,000,000 seeds have been tested, scenarios are + * unlikely to exceed this number of entities. + */ + const assumeValid = true; + const masterNode = deriveHdPrivateNodeFromSeed( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + valueMap[entityId]!, + assumeValid, + crypto + ); + const hdPrivateKey = encodeHdPrivateKey( + { + network: 'mainnet', + node: masterNode, + }, + crypto + ); + + return { ...all, [entityId]: hdPrivateKey }; + }, {}); + + return { + ...defaultScenario, + data: { + ...defaultScenario.data, + hdKeys: { + addressIndex: CompilerDefaults.defaultScenarioAddressIndex as const, + hdPrivateKeys, + }, + }, + }; +}; + +/** + * Extend the `data` property of a scenario definition with values from a parent + * scenario definition. Returns the extended value for `data`. + * + * @param parentData - the scenario `data` that is extended by the child + * scenario + * @param childData - the scenario `data` that may override values from the + * parent scenario + */ +// eslint-disable-next-line complexity +export const extendScenarioDefinitionData = ( + parentData: NonNullable, + childData: NonNullable +) => ({ + ...parentData, + ...childData, + ...(parentData.bytecode === undefined && childData.bytecode === undefined + ? {} + : { + bytecode: { + ...parentData.bytecode, + ...childData.bytecode, + }, + }), + ...(parentData.hdKeys === undefined && childData.hdKeys === undefined + ? {} + : { + hdKeys: { + ...parentData.hdKeys, + ...childData.hdKeys, + ...(parentData.hdKeys?.hdPrivateKeys === undefined && + childData.hdKeys?.hdPrivateKeys === undefined + ? {} + : { + hdPrivateKeys: { + ...parentData.hdKeys?.hdPrivateKeys, + ...childData.hdKeys?.hdPrivateKeys, + }, + }), + ...(parentData.hdKeys?.hdPublicKeys === undefined && + childData.hdKeys?.hdPublicKeys === undefined + ? {} + : { + hdPublicKeys: { + ...parentData.hdKeys?.hdPublicKeys, + ...childData.hdKeys?.hdPublicKeys, + }, + }), + }, + }), + ...(parentData.keys === undefined && childData.keys === undefined + ? {} + : { + keys: { + privateKeys: { + ...parentData.keys?.privateKeys, + ...childData.keys?.privateKeys, + }, + }, + }), +}); + +/** + * Extend a child scenario definition with values from a parent scenario + * definition. Returns the extended values for `data`, `transaction`, and + * `value`. + * + * @param parentScenario - the scenario that is extended by the child scenario + * @param childScenario - the scenario that may override values from the parent + * scenario + */ +// eslint-disable-next-line complexity +export const extendScenarioDefinition = < + ParentScenarioType extends AuthenticationTemplateScenario +>( + parentScenario: ParentScenarioType, + childScenario: AuthenticationTemplateScenario +) => + ({ + ...(parentScenario.data === undefined && childScenario.data === undefined + ? {} + : { + data: extendScenarioDefinitionData( + parentScenario.data ?? {}, + childScenario.data ?? {} + ), + }), + ...(parentScenario.transaction === undefined && + childScenario.transaction === undefined + ? {} + : { + transaction: { + ...parentScenario.transaction, + ...childScenario.transaction, + }, + }), + ...(parentScenario.sourceOutputs === undefined && + childScenario.sourceOutputs === undefined + ? {} + : { + sourceOutputs: + childScenario.sourceOutputs ?? parentScenario.sourceOutputs, + }), + } as ParentScenarioType extends ExtendedScenarioDefinition + ? ExtendedScenarioDefinition + : ScenarioDefinition); + +/** + * Generate the full scenario that is extended by the provided scenario + * identifier. Scenarios for which `extends` is `undefined` extend the default + * scenario for the provided compiler configuration. + */ +// eslint-disable-next-line complexity +export const generateExtendedScenario = < + Configuration extends AnyCompilerConfigurationIgnoreOperations, + CompilationContext +>({ + configuration, + scenarioId, + sourceScenarioIds = [], +}: { + /** + * The compiler configuration from which to generate the extended scenario + */ + configuration: Configuration; + /** + * The identifier of the scenario from which to generate the extended scenario + */ + scenarioId?: string | undefined; + /** + * an array of scenario identifiers indicating the path taken to arrive at the + * current scenario - used to detect and prevent cycles in extending scenarios + * (defaults to `[]`) + */ + sourceScenarioIds?: string[]; +}): ExtendedScenarioDefinition | string => { + if (scenarioId === undefined) { + return generateDefaultScenarioDefinition( + configuration + ); + } + + if (sourceScenarioIds.includes(scenarioId)) { + return `Cannot extend scenario "${scenarioId}": scenario "${scenarioId}" extends itself. Scenario inheritance path: ${sourceScenarioIds.join( + ' → ' + )}`; + } + const scenario = configuration.scenarios?.[scenarioId]; + if (scenario === undefined) { + return `Cannot extend scenario "${scenarioId}": a scenario with the identifier ${scenarioId} is not included in this compiler configuration.`; + } + const parentScenario = + scenario.extends === undefined + ? generateDefaultScenarioDefinition( + configuration + ) + : generateExtendedScenario({ + configuration, + scenarioId: scenario.extends, + sourceScenarioIds: [...sourceScenarioIds, scenarioId], + }); + if (typeof parentScenario === 'string') { + return parentScenario; + } + + return extendScenarioDefinition(parentScenario, scenario); +}; + +/** + * Derive standard {@link CompilationData} properties from an extended scenario + * definition. + * + * @param definition - a scenario definition that has been extended by the + * default scenario definition + */ +// eslint-disable-next-line complexity +export const extendedScenarioDefinitionToCompilationData = ( + definition: Required> & ScenarioDefinition +): CompilationData => ({ + ...(definition.data.currentBlockHeight === undefined + ? {} + : { + currentBlockHeight: definition.data.currentBlockHeight, + }), + ...(definition.data.currentBlockTime === undefined + ? {} + : { + currentBlockTime: definition.data.currentBlockTime, + }), + ...(definition.data.hdKeys === undefined + ? {} + : { + hdKeys: { + ...(definition.data.hdKeys.addressIndex === undefined + ? {} + : { + addressIndex: definition.data.hdKeys.addressIndex, + }), + ...(definition.data.hdKeys.hdPrivateKeys !== undefined && + Object.keys(definition.data.hdKeys.hdPrivateKeys).length > 0 + ? { + hdPrivateKeys: definition.data.hdKeys.hdPrivateKeys, + } + : {}), + ...(definition.data.hdKeys.hdPublicKeys === undefined + ? {} + : { + hdPublicKeys: definition.data.hdKeys.hdPublicKeys, + }), + }, + }), + ...(definition.data.keys?.privateKeys !== undefined && + Object.keys(definition.data.keys.privateKeys).length > 0 + ? { + keys: { + privateKeys: Object.entries(definition.data.keys.privateKeys).reduce( + (all, [id, hex]) => ({ ...all, [id]: hexToBin(hex) }), + {} + ), + }, + } + : {}), +}); + +/** + * Extend a {@link CompilationData} object with the compiled result of the + * bytecode scripts provided by an {@link AuthenticationTemplateScenarioData}. + */ +export const extendCompilationDataWithScenarioBytecode = < + Configuration extends AnyCompilerConfigurationIgnoreOperations, + CompilationContext +>({ + compilationData, + configuration, + scenarioDataBytecodeScripts, +}: { + /** + * The compilation data to extend. + */ + compilationData: CompilationData; + /** + * The compiler configuration in which to compile the scripts. + */ + configuration: Configuration; + /** + * The {@link AuthenticationTemplateScenarioData.bytecode} property. + */ + scenarioDataBytecodeScripts: NonNullable< + AuthenticationTemplateScenarioData['bytecode'] + >; +}) => { + const prefixBytecodeScriptId = (id: string) => + `${CompilerDefaults.scenarioBytecodeScriptPrefix}${id}`; + const bytecodeScripts = Object.entries(scenarioDataBytecodeScripts).reduce<{ + [bytecodeScriptIdentifier: string]: string; + }>( + (all, [id, script]) => ({ + ...all, + [prefixBytecodeScriptId(id)]: script, + }), + {} + ); + + const bytecodeScriptExtendedConfiguration: Configuration = { + ...configuration, + scripts: { + ...configuration.scripts, + ...bytecodeScripts, + }, + }; + + const bytecodeCompilations: ( + | { + bytecode: Uint8Array; + id: string; + } + | { + errors: CompilationError[] | [CompilationError]; + id: string; + } + )[] = Object.keys(scenarioDataBytecodeScripts).map((id) => { + const result = compileScriptRaw({ + configuration: bytecodeScriptExtendedConfiguration, + data: compilationData, + scriptId: prefixBytecodeScriptId(id), + }); + if (result.success) { + return { + bytecode: result.bytecode, + id, + }; + } + return { + errors: result.errors, + id, + }; + }); + + const failedResults = bytecodeCompilations.filter( + ( + result + ): result is { + errors: CompilationError[] | [CompilationError]; + id: string; + } => 'errors' in result + ); + if (failedResults.length > 0) { + return `${failedResults + .map( + (result) => + `Compilation error while generating bytecode for "${ + result.id + }": ${stringifyErrors(result.errors)}` + ) + .join('; ')}`; + } + + const compiledBytecode = ( + bytecodeCompilations as { + bytecode: Uint8Array; + id: string; + }[] + ).reduce<{ [fullIdentifier: string]: Uint8Array }>( + (all, result) => ({ ...all, [result.id]: result.bytecode }), + {} + ); + + return { + ...(Object.keys(compiledBytecode).length > 0 + ? { bytecode: compiledBytecode } + : {}), + ...compilationData, + } as CompilationData; +}; + +/** + * Compile a {@link AuthenticationTemplateScenarioOutput.valueSatoshis}, + * returning the `Uint8Array` result. + */ +export const compileAuthenticationTemplateScenarioValueSatoshis = ( + valueSatoshisDefinition: AuthenticationTemplateScenarioOutput['valueSatoshis'] = CompilerDefaults.defaultScenarioOutputValueSatoshis +) => + typeof valueSatoshisDefinition === 'string' + ? hexToBin(valueSatoshisDefinition) + : bigIntToBinUint64LE(BigInt(valueSatoshisDefinition)); + +/** + * Compile an {@link AuthenticationTemplateScenarioBytecode} definition for an + * {@link AuthenticationTemplateScenario}, returning either a + * simple `Uint8Array` result or a full CashAssembly {@link CompilationResult}. + */ +// eslint-disable-next-line complexity +export const compileAuthenticationTemplateScenarioBytecode = < + Configuration extends AnyCompilerConfigurationIgnoreOperations, + GenerateBytecode extends Compiler< + CompilationContextBCH, + Configuration, + ProgramState + >['generateBytecode'], + ProgramState +>({ + bytecodeDefinition, + compilationContext, + configuration, + defaultOverride, + extendedScenario, + generateBytecode, + lockingOrUnlockingScriptIdUnderTest, +}: { + bytecodeDefinition: AuthenticationTemplateScenarioBytecode; + compilationContext?: CompilationContextBCH; + configuration: Configuration; + extendedScenario: ExtendedScenarioDefinition; + defaultOverride: AuthenticationTemplateScenarioData; + generateBytecode: GenerateBytecode; + lockingOrUnlockingScriptIdUnderTest?: string; +}): + | CompilationResult + | Uint8Array + | { errors: [{ error: string }]; success: false } => { + if (typeof bytecodeDefinition === 'string') { + return hexToBin(bytecodeDefinition); + } + + const scriptId = + bytecodeDefinition.script === undefined || + Array.isArray(bytecodeDefinition.script) + ? lockingOrUnlockingScriptIdUnderTest + : bytecodeDefinition.script; + + /** + * The script ID to compile. If `undefined`, we are attempting to "copy" the + * script ID in a scenario generation that does not define a locking or + * unlocking script under test (e.g. the scenario is only used for debugging + * values in an editor) – in these cases, simply return an empty `Uint8Array`. + */ + if (scriptId === undefined) { + return hexToBin(''); + } + + const overrides = bytecodeDefinition.overrides ?? defaultOverride; + const overriddenDataDefinition = extendScenarioDefinitionData( + extendedScenario.data, + overrides + ); + const data = extendCompilationDataWithScenarioBytecode({ + compilationData: extendedScenarioDefinitionToCompilationData({ + data: overriddenDataDefinition, + }), + configuration, + scenarioDataBytecodeScripts: overriddenDataDefinition.bytecode ?? {}, + }); + + if (typeof data === 'string') { + const error = `Could not compile scenario "data.bytecode": ${data}`; + return { errors: [{ error }], success: false }; + } + + return generateBytecode({ + data: { ...data, compilationContext }, + debug: true, + scriptId, + }); +}; + +/** + * Generate a scenario given a compiler configuration. If neither `scenarioId` + * or `unlockingScriptId` are provided, the default scenario for the compiler + * configuration will be generated. + * + * Returns either the full `CompilationData` for the selected scenario or an + * error message (as a `string`). + * + * Note, this method should typically not be used directly, use + * {@link Compiler.generateScenario} instead. + */ +// eslint-disable-next-line complexity +export const generateScenarioBCH = < + Configuration extends AnyCompilerConfigurationIgnoreOperations, + GenerateBytecode extends Compiler< + CompilationContextBCH, + Configuration, + ProgramState + >['generateBytecode'], + ProgramState, + Debug extends boolean +>( + { + configuration, + generateBytecode, + scenarioId, + unlockingScriptId, + }: { + /** + * The compiler configuration from which to generate the scenario. + */ + configuration: Configuration; + + generateBytecode: GenerateBytecode; + /** + * The ID of the scenario to generate. If `undefined`, the default scenario. + */ + scenarioId?: string | undefined; + /** + * The ID of the unlocking script under test by this scenario. If + * `undefined` but required by the scenario, an error will be produced. + */ + unlockingScriptId?: string | undefined; + }, + debug?: Debug +): + | string + | (Debug extends true + ? ScenarioGenerationDebuggingResult + : Scenario) => { + const { scenarioDefinition, scenarioName } = + scenarioId === undefined + ? { scenarioDefinition: {}, scenarioName: `the default scenario` } + : { + scenarioDefinition: configuration.scenarios?.[scenarioId], + scenarioName: `scenario "${scenarioId}"`, + }; + + if (scenarioDefinition === undefined) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return `Cannot generate ${scenarioName}: a scenario definition with the identifier ${scenarioId!} is not included in this compiler configuration.`; + } + + const parentScenario = generateExtendedScenario< + Configuration, + CompilationContextBCH + >({ configuration, scenarioId }); + if (typeof parentScenario === 'string') { + return `Cannot generate ${scenarioName}: ${parentScenario}`; + } + + const extendedScenario = extendScenarioDefinition( + parentScenario, + scenarioDefinition + ); + const partialCompilationData = + extendedScenarioDefinitionToCompilationData(extendedScenario); + const fullCompilationData = extendCompilationDataWithScenarioBytecode({ + compilationData: partialCompilationData, + configuration, + scenarioDataBytecodeScripts: extendedScenario.data.bytecode ?? {}, + }); + + if (typeof fullCompilationData === 'string') { + return `Cannot generate ${scenarioName}. ${fullCompilationData}`; + } + + if ( + extendedScenario.transaction.inputs.length !== + extendedScenario.sourceOutputs.length + ) { + return `Cannot generate ${scenarioName}: could not match source outputs with inputs – "sourceOutputs" must be the same length as "transaction.inputs".`; + } + + const testedInputs = extendedScenario.transaction.inputs.filter((input) => + Array.isArray(input.unlockingBytecode) + ); + if (testedInputs.length !== 1) { + return `Cannot generate ${scenarioName}: the specific input under test in this scenario is ambiguous – "transaction.inputs" must include exactly one input that has "unlockingBytecode" set to ["slot"].`; + } + const testedInputIndex = extendedScenario.transaction.inputs.findIndex( + (input) => Array.isArray(input.unlockingBytecode) + ); + + const testedSourceOutputs = extendedScenario.sourceOutputs.filter((output) => + Array.isArray(output.lockingBytecode) + ); + if (testedSourceOutputs.length !== 1) { + return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous – "sourceOutputs" must include exactly one output that has "lockingBytecode" set to ["slot"].`; + } + + if ( + !Array.isArray( + extendedScenario.sourceOutputs[testedInputIndex]?.lockingBytecode + ) + ) { + return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous – the ["slot"] in "transaction.inputs" and "sourceOutputs" must be at the same index.`; + } + + const lockingScriptId = + unlockingScriptId === undefined + ? undefined + : configuration.unlockingScripts?.[unlockingScriptId]; + if (unlockingScriptId !== undefined && lockingScriptId === undefined) { + return `Cannot generate ${scenarioName} using unlocking script "${unlockingScriptId}": the locking script unlocked by "${unlockingScriptId}" is not provided in this compiler configuration.`; + } + + const sourceOutputCompilations = extendedScenario.sourceOutputs.map( + (sourceOutput, index) => { + const slot = Array.isArray(sourceOutput.lockingBytecode); + const bytecodeDefinition = slot + ? lockingScriptId === undefined + ? (CompilerDefaults.defaultScenarioBytecode as string) + : { script: lockingScriptId } + : sourceOutput.lockingBytecode ?? {}; + const defaultOverride = {}; + return { + compiled: { + lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + bytecodeDefinition, + configuration, + defaultOverride, + extendedScenario, + generateBytecode, + lockingOrUnlockingScriptIdUnderTest: lockingScriptId, + }), + valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( + sourceOutput.valueSatoshis + ), + }, + index, + slot, + type: 'source output' as const, + }; + } + ); + + const lockingCompilation = sourceOutputCompilations.find( + (compilation) => compilation.slot + )?.compiled.lockingBytecode as CompilationResult; + + const transactionOutputCompilations = + extendedScenario.transaction.outputs.map((transactionOutput, index) => { + const defaultOverride = { hdKeys: { addressIndex: 1 } }; + return { + compiled: { + lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + bytecodeDefinition: transactionOutput.lockingBytecode ?? {}, + configuration, + defaultOverride, + extendedScenario, + generateBytecode, + lockingOrUnlockingScriptIdUnderTest: lockingScriptId, + }), + valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( + transactionOutput.valueSatoshis + ), + }, + index, + type: 'transaction output' as const, + }; + }); + + const outputCompilationErrors = [ + ...sourceOutputCompilations, + ...transactionOutputCompilations, + ].reduce((accumulated, result) => { + if ('errors' in result.compiled.lockingBytecode) { + return [ + ...accumulated, + ...result.compiled.lockingBytecode.errors.map( + (errorObject) => + `Failed compilation of ${result.type} at index ${result.index}: ${errorObject.error}` + ), + ]; + } + return accumulated; + }, []); + + if (outputCompilationErrors.length > 0) { + const error = `Cannot generate ${scenarioName}: ${outputCompilationErrors.join( + ' ' + )}`; + if (debug === true) { + return { + lockingCompilation, + scenario: error, + } as Debug extends true + ? ScenarioGenerationDebuggingResult + : Scenario; + } + return error; + } + const sourceOutputCompilationsSuccess = + sourceOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + const transactionOutputCompilationsSuccess = + transactionOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + + interface AuthenticationTemplateScenarioOutputSuccessfulCompilation { + compiled: { + lockingBytecode: CompilationResultSuccess | Uint8Array; + valueSatoshis: Uint8Array; + }; + index: number; + slot?: boolean; + type: string; + } + + const extractOutput = ( + compilation: AuthenticationTemplateScenarioOutputSuccessfulCompilation + ) => { + const { lockingBytecode, valueSatoshis } = compilation.compiled; + return { + lockingBytecode: + 'bytecode' in lockingBytecode + ? lockingBytecode.bytecode + : lockingBytecode, + valueSatoshis, + }; + }; + + const sourceOutputs = sourceOutputCompilationsSuccess.map(extractOutput); + const outputs = transactionOutputCompilationsSuccess.map(extractOutput); + + const inputsContext = extendedScenario.transaction.inputs.map( + (input, inputIndex) => ({ + outpointIndex: input.outpointIndex ?? inputIndex, + outpointTransactionHash: hexToBin( + input.outpointTransactionHash ?? + CompilerDefaults.defaultScenarioInputOutpointTransactionHash + ), + sequenceNumber: + input.sequenceNumber ?? + CompilerDefaults.defaultScenarioInputSequenceNumber, + unlockingBytecode: undefined, + }) + ); + + const transactionInputCompilations = extendedScenario.transaction.inputs.map( + (input, index) => { + const slot = Array.isArray(input.unlockingBytecode); + const bytecodeDefinition = Array.isArray(input.unlockingBytecode) + ? unlockingScriptId === undefined + ? (CompilerDefaults.defaultScenarioBytecode as string) + : { script: unlockingScriptId } + : input.unlockingBytecode ?? {}; + const defaultOverride = {}; + return { + compiled: { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + outpointIndex: inputsContext[index]!.outpointIndex, + outpointTransactionHash: + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + inputsContext[index]!.outpointTransactionHash, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + sequenceNumber: inputsContext[index]!.sequenceNumber, + unlockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + bytecodeDefinition, + compilationContext: { + inputIndex: index, + sourceOutputs, + transaction: { + inputs: inputsContext, + locktime: extendedScenario.transaction.locktime, + outputs, + version: extendedScenario.transaction.version, + }, + }, + configuration, + defaultOverride, + extendedScenario, + generateBytecode, + lockingOrUnlockingScriptIdUnderTest: unlockingScriptId, + }), + }, + index, + slot, + }; + } + ); + + const unlockingCompilation = transactionInputCompilations.find( + (compilation) => compilation.slot + )?.compiled.unlockingBytecode as CompilationResult; + + interface AuthenticationTemplateScenarioInputSuccessfulCompilation { + compiled: { + outpointIndex: number; + outpointTransactionHash: Uint8Array; + sequenceNumber: number; + unlockingBytecode: CompilationResultSuccess | Uint8Array; + }; + index: number; + slot?: boolean; + type: string; + } + + const inputCompilationErrors = transactionInputCompilations.reduce( + (accumulated, result) => { + if ('errors' in result.compiled.unlockingBytecode) { + return [ + ...accumulated, + ...result.compiled.unlockingBytecode.errors.map( + (errorObject) => + `Failed compilation of input at index ${result.index}: ${errorObject.error}` + ), + ]; + } + return accumulated; + }, + [] + ); + + if (inputCompilationErrors.length > 0) { + const error = `Cannot generate ${scenarioName}: ${inputCompilationErrors.join( + ' ' + )}`; + if (debug === true) { + return { + lockingCompilation, + scenario: error, + unlockingCompilation, + } as Debug extends true + ? ScenarioGenerationDebuggingResult + : Scenario; + } + return error; + } + + const transactionInputCompilationsSuccess = + transactionInputCompilations as AuthenticationTemplateScenarioInputSuccessfulCompilation[]; + + const inputs = transactionInputCompilationsSuccess.map((compilation) => { + const { + outpointIndex, + outpointTransactionHash, + sequenceNumber, + unlockingBytecode, + } = compilation.compiled; + return { + outpointIndex, + outpointTransactionHash, + sequenceNumber, + unlockingBytecode: + 'bytecode' in unlockingBytecode + ? unlockingBytecode.bytecode + : unlockingBytecode, + }; + }); + + const scenario: Scenario = { + data: fullCompilationData, + program: { + inputIndex: testedInputIndex, + sourceOutputs, + transaction: { + inputs, + locktime: extendedScenario.transaction.locktime, + outputs, + version: extendedScenario.transaction.version, + }, + }, + }; + + return ( + debug === true + ? { lockingCompilation, scenario, unlockingCompilation } + : scenario + ) as Debug extends true + ? ScenarioGenerationDebuggingResult + : Scenario; +}; diff --git a/src/lib/template/standard/p2pkh.spec.ts b/src/lib/compiler/standard/p2pkh.spec.ts similarity index 78% rename from src/lib/template/standard/p2pkh.spec.ts rename to src/lib/compiler/standard/p2pkh.spec.ts index 2158285c..1b051797 100644 --- a/src/lib/template/standard/p2pkh.spec.ts +++ b/src/lib/compiler/standard/p2pkh.spec.ts @@ -1,14 +1,13 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; import { authenticationTemplateP2pkh, authenticationTemplateP2pkhNonHd, - validateAuthenticationTemplate, -} from '../../lib'; + importAuthenticationTemplate, +} from '../../lib.js'; test('authenticationTemplateP2pkh is valid', (t) => { - const template = validateAuthenticationTemplate( + const template = importAuthenticationTemplate( authenticationTemplateP2pkhNonHd ); t.true(typeof template !== 'string'); @@ -34,6 +33,6 @@ test('authenticationTemplateP2pkh is mostly equivalent to authenticationTemplate }); test('authenticationTemplateP2pkhHd is valid', (t) => { - const template = validateAuthenticationTemplate(authenticationTemplateP2pkh); + const template = importAuthenticationTemplate(authenticationTemplateP2pkh); t.true(typeof template !== 'string'); }); diff --git a/src/lib/template/standard/p2pkh.ts b/src/lib/compiler/standard/p2pkh.ts similarity index 71% rename from src/lib/template/standard/p2pkh.ts rename to src/lib/compiler/standard/p2pkh.ts index f5bc70ce..bf0af783 100644 --- a/src/lib/template/standard/p2pkh.ts +++ b/src/lib/compiler/standard/p2pkh.ts @@ -1,7 +1,7 @@ -import { AuthenticationTemplate } from '../template-types'; +import type { AuthenticationTemplate } from '../../lib'; /** - * A standard single-factor authentication template which uses + * A standard single-factor authentication template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * @@ -14,7 +14,7 @@ import { AuthenticationTemplate } from '../template-types'; export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', description: - 'A standard single-factor authentication template which uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', + 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', entities: { owner: { description: 'The individual who can spend from this wallet.', @@ -22,7 +22,7 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { scripts: ['lock', 'unlock'], variables: { key: { - description: 'The private key which controls this wallet.', + description: 'The private key that controls this wallet.', name: 'Key', type: 'Key', }, @@ -48,7 +48,7 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { }; /** - * A standard single-factor authentication template which uses + * A standard single-factor authentication template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * @@ -61,11 +61,11 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { export const authenticationTemplateP2pkh: AuthenticationTemplate = { $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', description: - 'A standard single-factor authentication template which uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports an "Observer (Watch-Only)" entity.', + 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports an "Observer (Watch-Only)" entity.', entities: { observer: { description: - 'An entity which can generate addresses but cannot spend funds from this wallet.', + 'An entity that can generate addresses but cannot spend funds from this wallet.', name: 'Observer (Watch-Only)', scripts: ['lock'], }, @@ -75,7 +75,7 @@ export const authenticationTemplateP2pkh: AuthenticationTemplate = { scripts: ['lock', 'unlock'], variables: { key: { - description: 'The private key which controls this wallet.', + description: 'The private key that controls this wallet.', name: 'Key', type: 'HdKey', }, diff --git a/src/lib/compiler/standard/standard.ts b/src/lib/compiler/standard/standard.ts new file mode 100644 index 00000000..f4329ca5 --- /dev/null +++ b/src/lib/compiler/standard/standard.ts @@ -0,0 +1 @@ +export * from './p2pkh.js'; diff --git a/src/lib/template/template-types.ts b/src/lib/compiler/template-types.ts similarity index 77% rename from src/lib/template/template-types.ts rename to src/lib/compiler/template-types.ts index 25aee623..eb93cb8b 100644 --- a/src/lib/template/template-types.ts +++ b/src/lib/compiler/template-types.ts @@ -2,7 +2,7 @@ /** * Because this file is consumed by the `doc:generate-json-schema` package * script to produce a JSON schema, large sections of the below documentation - * are copied from this libraries `Transaction` and `CompilationData` types. + * are copied from this library's `Transaction` and `CompilationData` types. * * This is preferable to importing those types, as most documentation needs to * be slightly modified for this context, and avoiding imports in this file @@ -10,15 +10,15 @@ */ /** - * An `AuthenticationTemplate` (A.K.A. `Bitauth Template`) specifies a set of - * locking scripts, unlocking scripts, and other information required to use a - * certain authentication scheme. Templates fully describe wallets and protocols - * in a way that can be shared between software clients. + * An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set + * of locking scripts, unlocking scripts, and other information required to use + * a certain authentication scheme. Templates fully describe wallets and + * protocols in a way that can be shared between software clients. */ export interface AuthenticationTemplate { /** - * The URI which identifies the JSON Schema used by this template. Try: - * `https://bitauth.com/schemas/authentication-template-v0.schema.json` + * The URI that identifies the JSON Schema used by this template. Try: + * `https://libauth.org/schemas/authentication-template-v0.schema.json` * to enable documentation, autocompletion, and validation in JSON documents. */ $schema?: string; @@ -58,9 +58,9 @@ export interface AuthenticationTemplate { scripts: { [scriptId: string]: | AuthenticationTemplateScript - | AuthenticationTemplateScriptUnlocking | AuthenticationTemplateScriptLocking - | AuthenticationTemplateScriptTested; + | AuthenticationTemplateScriptTested + | AuthenticationTemplateScriptUnlocking; }; /** * A list of authentication virtual machine versions supported by this @@ -88,6 +88,7 @@ export interface AuthenticationTemplate { version: 0; } +// TODO: clean up VM versions? /** * Allowable identifiers for authentication virtual machine versions. The `BCH` * prefix identifies the Bitcoin Cash network, the `BSV` prefix identifies the @@ -101,21 +102,21 @@ export interface AuthenticationTemplate { * compatibility with the live virtual machine version. */ export type AuthenticationVirtualMachineIdentifier = - | 'BCH_2022_11_SPEC' - | 'BCH_2022_11' - | 'BCH_2022_05_SPEC' - | 'BCH_2022_05' - | 'BCH_2021_11_SPEC' - | 'BCH_2021_11' - | 'BCH_2021_05_SPEC' - | 'BCH_2021_05' + | 'BCH_2019_05' + | 'BCH_2019_11' + | 'BCH_2020_05' | 'BCH_2020_11_SPEC' | 'BCH_2020_11' - | 'BCH_2020_05' - | 'BCH_2019_11' - | 'BCH_2019_05' - | 'BSV_2020_02' + | 'BCH_2021_05_SPEC' + | 'BCH_2021_05' + | 'BCH_2021_11_SPEC' + | 'BCH_2021_11' + | 'BCH_2022_05_SPEC' + | 'BCH_2022_05' + | 'BCH_2022_11_SPEC' + | 'BCH_2022_11' | 'BSV_2018_11' + | 'BSV_2020_02' | 'BTC_2017_08'; /** @@ -148,7 +149,7 @@ export interface AuthenticationTemplateEntity { */ scripts?: string[]; /** - * A map of variables which must be provided by this entity for use in the + * A map of variables that must be provided by this entity for use in the * template's scripts. Some variables are required before locking script * generation, while some variables can or must be resolved only before * unlocking script generation. @@ -164,33 +165,33 @@ export interface AuthenticationTemplateEntity { */ export interface AuthenticationTemplateScenarioData { /** - * A map of full identifiers to scripts which compile to their values for this - * scenario. + * A map of full identifiers to CashAssembly scripts that compile to each + * identifier's value for this scenario. Allowing `bytecode` to be specified + * as scripts (rather than e.g. hex) offers greater power and flexibility. * - * Scripts are provided in BTL, and have access to each other and all other - * template scripts and defined variables. However, cyclical references will - * produce an error at compile time. Also, because the results of these - * compilations will be used to generate the transaction context for this - * scenario, these scripts may not use compiler operations which themselves - * require access to transaction context (e.g. signatures). + * Bytecode scripts have access to each other and all other template scripts + * and defined variables, however, cyclical references will produce an error + * at compile time. Also, because the results of these compilations will be + * used to generate the compilation context for this scenario, these scripts + * may not use compiler operations that themselves require access to + * compilation context (e.g. signatures). * * The provided `fullIdentifier` should match the complete identifier for * each item, e.g. `some_wallet_data`, `variable_id.public_key`, or * `variable_id.signature.all_outputs`. * * All `AddressData` and `WalletData` variables must be provided via - * `bytecode`, and pre-computed results for operations of other variable types + * `bytecode` (though the default scenario automatically includes reasonable + * values), and pre-computed results for operations of other variable types * (e.g. `key.public_key`) may also be provided via this property. * * Because each bytecode identifier may precisely match the identifier of the * variable it defines for this scenario, references between these scripts - * must refer to the target script with a `_scenario_` prefix. E.g. to + * must refer to the target script with a `_scenario.` prefix. E.g. to * reference a sibling script `my_foo` from `my_bar`, the `my_bar` script must - * use the identifier `_scenario_my_foo`. + * use the identifier `_scenario.my_foo`. */ - bytecode?: { - [fullIdentifier: string]: string; - }; + bytecode?: { [fullIdentifier: string]: string }; /** * The current block height at the "address creation time" implied in this * scenario. @@ -218,8 +219,10 @@ export interface AuthenticationTemplateScenarioData { * the dynamic index (`i`) used in each `privateDerivationPath` or * `publicDerivationPath`. * - * This is required for any compiler operation which requires derivation. + * This is required for any compiler operation that requires derivation. * Typically, the value is incremented by one for each address in a wallet. + * + * Defaults to `0`. */ addressIndex?: number; /** @@ -234,9 +237,7 @@ export interface AuthenticationTemplateScenarioData { * `hdPublicKeys`) are provided for the same entity in the same scenario * (not recommended), the HD private key is used. */ - hdPublicKeys?: { - [entityId: string]: string; - }; + hdPublicKeys?: { [entityId: string]: string }; /** * A map of entity IDs to master HD private keys. These master HD private * keys are used to derive each `HdKey` variable assigned to that entity @@ -249,9 +250,7 @@ export interface AuthenticationTemplateScenarioData { * `hdPublicKeys`) are provided for the same entity in the same scenario * (not recommended), the HD private key is used. */ - hdPrivateKeys?: { - [entityId: string]: string; - }; + hdPrivateKeys?: { [entityId: string]: string }; }; /** * An object describing the settings used for `Key` variables in this @@ -262,12 +261,45 @@ export interface AuthenticationTemplateScenarioData { * A map of `Key` variable IDs to their 32-byte, hexadecimal-encoded private * key values. */ - privateKeys?: { - [variableId: string]: string; - }; + privateKeys?: { [variableId: string]: string }; }; } +/** + * A type that describes the configuration for a particular locking or + * unlocking bytecode within an authentication template scenario. + * + * Bytecode may be specified as either a hexadecimal-encoded string or an object + * describing the required compilation. + * + * For `sourceOutputs` and `transaction.inputs`, defaults to + * `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to + * `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`. + */ +export type AuthenticationTemplateScenarioBytecode = + | string + | { + /** + * The identifier of the script to compile when generating this bytecode. + * May also be set to `["copy"]`, which is automatically replaced with the + * identifier of the locking or unlocking script under test, respectively. + * + * If undefined, defaults to `["copy"]`. + */ + script?: string | ['copy']; + /** + * Scenario data that extends the scenario's top-level `data` during + * script compilation. + * + * Each property is extended individually – to modify a property set by + * the top-level scenario `data`, the new value must be listed here. + * + * Defaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults + * to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`. + */ + overrides?: AuthenticationTemplateScenarioData; + }; + /** * An example input used to define a scenario for an authentication template. */ @@ -275,7 +307,9 @@ export interface AuthenticationTemplateScenarioInput { /** * The index of the output in the transaction from which this input is spent. * - * If undefined, this defaults to `0`. + * If undefined, this defaults to the same index as the input itself (so that + * by default, every outpoint in the produced transaction is different, even + * if an empty `outpointTransactionHash` is used for each transaction). */ outpointIndex?: number; /** @@ -297,11 +331,11 @@ export interface AuthenticationTemplateScenarioInput { * If undefined, this defaults to `0`. * * @remarks - * A sequence number is a complex bitfield which can encode several properties + * A sequence number is a complex bitfield that can encode several properties * about an input: * - **sequence age support** – whether or not the input can use * `OP_CHECKSEQUENCEVERIFY`, and the minimum number of blocks or length of - * time which has passed since this input's source transaction was mined (up + * time that has passed since this input's source transaction was mined (up * to approximately 1 year). * - **locktime support** – whether or not the input can use * `OP_CHECKLOCKTIMEVERIFY` @@ -317,7 +351,7 @@ export interface AuthenticationTemplateScenarioInput { * input: a `lockingBytecode` can use the `OP_CHECKSEQUENCEVERIFY` operation * to verify that the funds being spent have been "locked" for a minimum * required amount of time (or block count). This can be used in protocols - * which require a reliable "proof-of-publication", like escrow, time-delayed + * that require a reliable "proof-of-publication", like escrow, time-delayed * withdrawals, and various payment channel protocols. * * Sequence age support is enabled unless the "disable bit" – the most @@ -352,7 +386,7 @@ export interface AuthenticationTemplateScenarioInput { * intended for use in a multi-party signing protocol where parties updated * the "sequence number" to indicate to miners that this input should replace * a previously-signed input in an existing, not-yet-mined transaction. The - * original use-case was not completed and relied on behavior which can not be + * original use-case was not completed and relied on behavior that can not be * enforced by mining consensus, so the field was mostly-unused until it was * repurposed by BIP68 in block `419328`. See BIP68, BIP112, and BIP113 for * details. @@ -360,63 +394,40 @@ export interface AuthenticationTemplateScenarioInput { sequenceNumber?: number; /** * The `unlockingBytecode` value of this input for this scenario. This must be - * either a `null` value – indicating that this input contains the - * `unlockingBytecode` under test by the scenario – or a hexadecimal-encoded - * bytecode value. + * either `["slot"]`, indicating that this input contains the + * `unlockingBytecode` under test by the scenario, or an + * `AuthenticationTemplateScenarioBytecode`. * - * Defaults to an empty string (`''`). For a scenario to be valid, - * `unlockingBytecode` must be `null` for exactly one input in the scenario. + * For a scenario to be valid, `unlockingBytecode` must be `["slot"]` for + * exactly one input in the scenario. * - * @remarks - * While the `outpointIndex`, `outpointTransactionHash`, and `sequenceNumber` - * of every input is part of a transaction's signing serialization, as of - * 2020, no virtual machine currently requires access to the - * `unlockingBytecode` of sibling inputs during the evaluation of an input's - * `unlockingBytecode`. However, for completeness (and to allow for testing of - * virtual machines with this requirement), scenarios may also specify an - * `unlockingBytecode` value for each input not under test. - */ - unlockingBytecode?: null | string; + * Defaults to `["slot"]`. + */ + unlockingBytecode?: AuthenticationTemplateScenarioBytecode | ['slot']; } /** * An example output used to define a scenario for an authentication template. */ -export interface AuthenticationTemplateScenarioOutput { - /** - * The bytecode used to encumber this transaction output for this scenario. - * This value is included in signing serializations, and therefore has an - * effect on the transaction context for this scenario. - * - * This value may be provided as either a hexadecimal-encoded string or an - * object describing the required compilation. - * - * If undefined, this defaults to `{}`, which uses the default values for - * `script` and `overrides`, respectively. - */ - readonly lockingBytecode?: - | string - | { - /** - * The identifier of the script to compile when generating this - * `lockingBytecode`. May also be set to `null`, which represents the - * identifier of the locking script unlocked by the unlocking script - * under test. - * - * If undefined, defaults to `null`. - */ - script?: string | null; - /** - * Scenario data which extends this scenario's top-level data during - * script compilation. - * - * Each property is extended individually – to modify a property set by - * the top-level scenario data, the new value must be listed here. - * - * If undefined, defaults to `{ "hdKeys": { "addressIndex": 1 } }`. - */ - overrides?: AuthenticationTemplateScenarioData; - }; +export interface AuthenticationTemplateScenarioOutput< + IsSourceOutput extends boolean +> { + /** + * The locking bytecode used to encumber this output. + * + * `lockingBytecode` values may be provided as a hexadecimal-encoded string or + * as an object describing the required compilation. If undefined, defaults to + * `{}`, which uses the default values for `script` and `overrides`, + * respectively. + * + * Only source outputs may specify a `lockingBytecode` of `["slot"]`; this + * identifies the source output in which the locking script under test will be + * placed. (To be valid, every scenario's `sourceOutputs` property must have + * exactly one source output slot and one input slot at the same index.) + */ + readonly lockingBytecode?: IsSourceOutput extends true + ? AuthenticationTemplateScenarioBytecode | ['slot'] + : AuthenticationTemplateScenarioBytecode; /** * The value of the output in satoshis, the smallest unit of bitcoin. * @@ -427,18 +438,31 @@ export interface AuthenticationTemplateScenarioOutput { * `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value * is defined using a `number`. However, this value may also be defined using * a 16-character, hexadecimal-encoded `string`, to allow for the full range - * of the 64-bit unsigned, little-endian integer used to serialize `satoshis` - * in the encoded output format, e.g. `"ffffffffffffffff"`. This is useful - * for representing scenarios where intentionally excessive values are - * provided (to ensure an otherwise properly-signed transaction can never be - * included in the blockchain), e.g. transaction size estimations or off-chain - * Bitauth signatures. + * of the 64-bit unsigned, little-endian integer used to encode + * `valueSatoshis` in the encoded output format, e.g. `"ffffffffffffffff"`. + * This is useful for representing scenarios where intentionally excessive + * values are provided (to ensure an otherwise properly-signed transaction can + * never be included in the blockchain), e.g. transaction size estimations or + * off-chain Bitauth signatures. * * If undefined, this defaults to: `0`. */ - readonly satoshis?: number | string; + readonly valueSatoshis?: number | string; } +/** + * A transaction output used to define an authentication template scenario + * transaction. + */ +export type AuthenticationTemplateScenarioTransactionOutput = + AuthenticationTemplateScenarioOutput; + +/** + * A source output used by an authentication template scenario. + */ +export type AuthenticationTemplateScenarioSourceOutput = + AuthenticationTemplateScenarioOutput; + /** * An object describing the configuration for a particular scenario within an * authentication template. @@ -461,7 +485,7 @@ export interface AuthenticationTemplateScenario { */ description?: string; /** - * The identifier of the scenario which this scenario extends. Any `data` or + * The identifier of the scenario that this scenario extends. Any `data` or * `transaction` properties not defined in this scenario inherit from the * extended parent scenario. * @@ -480,7 +504,7 @@ export interface AuthenticationTemplateScenario { * mined block after the genesis block: * `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. This * default value was chosen to be low enough to simplify the debugging of - * block height offsets while remaining differentiated from `0` and `1` which + * block height offsets while remaining differentiated from `0` and `1`, which * are used both as boolean return values and for control flow. * - `currentBlockTime` is set to `1231469665`. This is the Median Time-Past * block time (BIP113) of block `2`. @@ -489,7 +513,7 @@ export interface AuthenticationTemplateScenario { * - if the scenario is being used for transaction estimation, all * transaction properties are taken from the transaction being estimated. * - if the scenario is being used for script testing and validation, the - * default value for each `transaction` property used. + * default value for each `transaction` property is used. * * When a scenario is extended, each property of `data` and `transaction` is * extended individually: if the extending scenario does not provide a new @@ -510,14 +534,14 @@ export interface AuthenticationTemplateScenario { * If undefined, inherits the default value for each property: * ```json * { - * "inputs": [{ "unlockingBytecode": null }], + * "inputs": [{ "unlockingBytecode": ['slot'] }], * "locktime": 0, - * "outputs": [{ "lockingBytecode": "" }], + * "outputs": [{ "lockingBytecode": {} }], * "version": 2 * } * ``` * - * Any `transaction` property which is not set will be inherited from the + * Any `transaction` property that is not set will be inherited from the * scenario specified by `extends`. when specifying the `inputs` and `outputs` * properties, each input and output extends the default values for inputs and * outputs, respectively. @@ -528,37 +552,38 @@ export interface AuthenticationTemplateScenario { * "outpointIndex": 0, * "outpointTransactionHash": * "0000000000000000000000000000000000000000000000000000000000000000", - * "sequenceNumber": 0 + * "sequenceNumber": 0, + * "unlockingBytecode": ['slot'] * } * ``` * And an output of `{}` is interpreted as: * ```json * { * "lockingBytecode": { - * "script": null, + * "script": ['copy'], * "overrides": { "hdKeys": { "addressIndex": 1 } } * }, - * "satoshis": 0 + * "valueSatoshis": 0 * } * ``` */ transaction?: { /** - * The list of inputs to use when generating the transaction context for - * this scenario. + * The list of inputs to use when generating the transaction for this + * scenario. * * To be valid the `inputs` property must have exactly one input with - * `unlockingBytecode` set to `null`. This is the input in which the + * `unlockingBytecode` set to `["slot"]`. This is the input in which the * unlocking script under test will be placed. * * If undefined, inherits the default scenario `inputs` value: - * `[{ "unlockingBytecode": null }]`. + * `[{ "unlockingBytecode": ["slot"] }]`. */ inputs?: AuthenticationTemplateScenarioInput[]; /** - * The locktime to use when generating the transaction context for this - * scenario. A positive integer from `0` to a maximum of `4294967295` – if - * undefined, defaults to `0`. + * The locktime to use when generating the transaction for this scenario. A + * positive integer from `0` to a maximum of `4294967295` – if undefined, + * defaults to `0`. * * Locktime can be provided as either a timestamp or a block height. Values * less than `500000000` are understood to be a block height (the current @@ -590,7 +615,7 @@ export interface AuthenticationTemplateScenario { * input). * * This is inconsequential for valid transactions, since any transaction - * which disables `locktime` must have disabled locktime for all of its + * that disables `locktime` must have disabled locktime for all of its * inputs; `OP_CHECKLOCKTIMEVERIFY` is always properly enforced. However, * because an input can individually "disable locktime" without the full * transaction *actually disabling locktime*, it is possible that a @@ -600,30 +625,34 @@ export interface AuthenticationTemplateScenario { */ locktime?: number; /** - * The list of outputs to use when generating the transaction context for - * this scenario. + * The list of outputs to use when generating the transaction for this + * scenario. * - * If undefined, defaults to `[{ "lockingBytecode": "" }]`. + * If undefined, defaults to `[{ "lockingBytecode": {} }]`. */ - outputs?: AuthenticationTemplateScenarioOutput[]; + outputs?: AuthenticationTemplateScenarioTransactionOutput[]; /** - * The version to use when generating the transaction context for this - * scenario. A positive integer from `0` to a maximum of `4294967295` – if - * undefined, inherits the default scenario `version` value: `2`. + * The version to use when generating the transaction for this scenario. A + * positive integer from `0` to a maximum of `4294967295` – if undefined, + * inherits the default scenario `version` value: `2`. */ version?: number; }; /** - * The value in satoshis of the hypothetical output being spent by the input - * under test in this scenario. + * The list of source outputs (a.k.a. UTXOs) to use when generating the + * compilation context for this scenario. * - * May be encoded as either a number (for values below `2^53-1`) or a - * little-endian, unsigned 64-bit integer in hexadecimal format (a - * 16-character string). + * The `sourceOutputs` property must have the same length as + * `transaction.inputs`, and each source output must be ordered to match the + * index of the input that spends it. * - * If undefined, defaults to `0`. + * To be valid the `sourceOutputs` property must have exactly one source + * output with `lockingBytecode` set to `["slot"]` – the output at the same + * index as the `["slot"]` input in `transaction.inputs`. + * + * If undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`. */ - value?: number | string; + sourceOutputs?: AuthenticationTemplateScenarioSourceOutput[]; } /** @@ -637,7 +666,7 @@ export interface AuthenticationTemplateScript { */ name?: string; /** - * The script definition in BTL (Bitauth Templating Language). + * The script definition in CashAssembly. */ script: string; } @@ -649,8 +678,8 @@ export interface AuthenticationTemplateScriptUnlocking * * The minimum input age required for this unlocking script to become valid. * - * This value is provided as a BTL script which must compile to the least - * significant 3 bytes of the minimum sequence number required for this + * This value is provided as a CashAssembly script that must compile to the + * least significant 3 bytes of the minimum sequence number required for this * unlocking script to be valid (the "type bit" and the 2-byte "value" – see * BIP68 for details). This script has access to all other template scripts * and variables, but cyclical references will produce an error at compile @@ -675,7 +704,7 @@ export interface AuthenticationTemplateScriptUnlocking * compiling an estimated transaction. * * Using estimate scenarios, it's possible for wallet software to compute - * an "estimated transaction", an invalid transaction which is guaranteed to + * an "estimated transaction", an invalid transaction that is guaranteed to * be the same byte length as the final transaction. This length can be used * to calculate the required transaction fee and assign values to the * transaction's change output(s). Because estimate scenarios provide @@ -689,23 +718,23 @@ export interface AuthenticationTemplateScriptUnlocking */ estimate?: string; /** - * A list of the scenario identifiers which – when used to compile this - * unlocking script and the script it unlocks – result in bytecode which fails + * A list of the scenario identifiers that – when used to compile this + * unlocking script and the script it unlocks – result in bytecode that fails * program verification. * * These scenarios can be used to test this script in development and review. */ fails?: string[]; /** - * A list of the scenario identifiers which – when used to compile this + * A list of the scenario identifiers that – when used to compile this * unlocking script and the script it unlocks – result in a compilation error. * * These scenarios can be used to test this script in development and review. */ invalid?: string[]; /** - * A list of the scenario identifiers which – when used to compile this - * unlocking script and the script it unlocks – result in bytecode which + * A list of the scenario identifiers that – when used to compile this + * unlocking script and the script it unlocks – result in bytecode that * passes program verification. * * These scenarios can be used to test this script in development and review. @@ -732,9 +761,9 @@ export interface AuthenticationTemplateScriptUnlocking * If `timeLockType` is undefined, the script is assumed to have no reliance * on absolute time locks. */ - timeLockType?: 'timestamp' | 'height'; + timeLockType?: 'height' | 'timestamp'; /** - * The identifier of the script which can be unlocked by this script. + * The identifier of the script that can be unlocked by this script. * * The presence of the `unlocks` property indicates that this script is an * unlocking script, and the script it unlocks must be a locking script. @@ -745,15 +774,15 @@ export interface AuthenticationTemplateScriptUnlocking export interface AuthenticationTemplateScriptLocking extends AuthenticationTemplateScript { /** - * Indicates if P2SH infrastructure should be used when producing bytecode - * related to this script. For more information on P2SH, see BIP16. + * Indicates if P2SH20 infrastructure should be used when producing bytecode + * related to this script. For more information on P2SH20, see BIP16. * - * When compiling locking scripts of type `p2sh`, the result will be placed in - * a P2SH "redeem script" format: + * When compiling locking scripts of type `p2sh20`, the result will be placed + * in a P2SH20 "redeem script" format: * `OP_HASH160 <$( OP_HASH160)> OP_EQUAL` * - * When compiling unlocking scripts which unlock locking scripts of type - * `p2sh`, the result will be transformed into the P2SH unlocking format: + * When compiling unlocking scripts that unlock locking scripts of type + * `p2sh20`, the result will be transformed into the P2SH20 unlocking format: * `unlockingBytecode ` (where `lockingBytecode` is the * compiled bytecode of the locking script, without the "redeem script" * transformation.) @@ -762,7 +791,7 @@ export interface AuthenticationTemplateScriptLocking * locking script. It must be present on any script referenced by the * `unlocks` property of another script. */ - lockingType: 'standard' | 'p2sh'; + lockingType: 'p2sh20' | 'standard'; } export interface AuthenticationTemplateScriptTested @@ -771,7 +800,7 @@ export interface AuthenticationTemplateScriptTested * If set to `true`, indicates that this script should be wrapped in a push * statement for testing. * - * This is useful for scripts which serve as "bytecode templates" – e.g. + * This is useful for scripts that serve as "bytecode templates" – e.g. * formatted messages or signature preimages. These scripts are typically not * evaluated as bytecode but appear within push statements elsewhere in the * template. @@ -780,10 +809,10 @@ export interface AuthenticationTemplateScriptTested */ pushed?: boolean; /** - * One or more tests which can be used during development and during template - * validation to confirm the correctness of this inline script. + * One or more tests that can be used during development and during template + * validation to confirm the correctness of this tested script. */ - tests: AuthenticationTemplateScriptTest[]; + tests: { [testId: string]: AuthenticationTemplateScriptTest }; } export interface AuthenticationTemplateScriptTest { @@ -807,8 +836,8 @@ export interface AuthenticationTemplateScriptTest { */ name?: string; /** - * A list of the scenario identifiers which – when used to compile this - * test and the script it tests – result in bytecode which fails program + * A list of the scenario identifiers that – when used to compile this + * test and the script it tests – result in bytecode that fails program * verification. The `setup` script is used in place of an unlocking * script, and the concatenation of the script under test and the `check` * script are used in place of a locking script. @@ -817,7 +846,7 @@ export interface AuthenticationTemplateScriptTest { */ fails?: string[]; /** - * A list of the scenario identifiers which – when used to compile this + * A list of the scenario identifiers that – when used to compile this * test and the script it tests – result in a compilation error. The `setup` * script is used in place of an unlocking script, and the concatenation of * the script under test and the `check` script are used in place of a locking @@ -827,8 +856,8 @@ export interface AuthenticationTemplateScriptTest { */ invalid?: string[]; /** - * A list of the scenario identifiers which – when used to compile this - * test and the script it tests – result in bytecode which passes program + * A list of the scenario identifiers that – when used to compile this + * test and the script it tests – result in bytecode that passes program * verification. The `setup` script is used in place of an unlocking * script, and the concatenation of the script under test and the `check` * script are used in place of a locking script. @@ -838,7 +867,7 @@ export interface AuthenticationTemplateScriptTest { passes?: string[]; /** * A script to evaluate before the script being tested. This can be used to - * push values to the stack which are operated on by the tested script. + * push values to the stack that are operated on by the tested script. * * In scenario testing, this script is treated as the unlocking script. */ @@ -857,13 +886,6 @@ export interface AuthenticationTemplateVariableBase { */ name?: string; type: string; - /** - * TODO: revisit in future versions - * - * a script which must leave a 1 on the stack if the variable input is valid - * (e.g. to check unusual signatures from each signer as they are received) - */ - // validate?: string; } export interface AuthenticationTemplateHdKey @@ -881,7 +903,7 @@ export interface AuthenticationTemplateHdKey * compilation data when deriving this `HdKey`. (Default: 0) * * This is useful for deriving the "next" (`1`) or "previous" (`-1`) address - * to be used in the current compilation context. + * to be used in the current compiler configuration. */ addressOffset?: number; /** @@ -920,7 +942,7 @@ export interface AuthenticationTemplateHdKey * `derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)` * * Because hardened derivation requires knowledge of the private key, `HdKey` - * variables with `derivationPath`s which include hardened derivation cannot + * variables with `derivationPath`s that include hardened derivation cannot * use HD public derivation (the `hdPublicKeys` property in * `CompilationData`). Instead, compilation requires the respective HD private * key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public @@ -937,7 +959,7 @@ export interface AuthenticationTemplateHdKey * later derivation levels use non-hardened derivation, `publicDerivationPath` * can be used to specify a public derivation path beginning from * `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a - * non-hardened segment of `privateDerivationPath` which follows + * non-hardened segment of `privateDerivationPath` that follows * `hdPublicKeyDerivationPath`). * * The first character must be `M` (public derivation), followed by sets of @@ -946,7 +968,7 @@ export interface AuthenticationTemplateHdKey * * For example, if `privateDerivationPath` is `m/0'/i`, it is not possible to * derive the equivalent public key with only the HD public key `M`. (The path - * "`M/0'/i`" is impossible). However, given the HD public key for `m/0'`, it + * "`M/0'/i`" is impossible.) However, given the HD public key for `m/0'`, it * is possible to derive the public key of `m/0'/i` for any `i`. In this case, * `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` * would be the remaining `M/i`. @@ -1000,7 +1022,7 @@ export interface AuthenticationTemplateWalletData */ name?: string; /** - * The `WalletData` type provides a static piece of data which should be + * The `WalletData` type provides a static piece of data that should be * collected once and stored at the time of wallet creation. `WalletData` * should be persistent for the life of the wallet, rather than changing from * locking script to locking script. @@ -1020,15 +1042,6 @@ export interface AuthenticationTemplateAddressData * A single-line, Title Case, human-readable name for this address data. */ name?: string; - /** - * A script ID used to compile this AddressData. When a `source` is provided, - * wallet implementations can automatically compile the expected value without - * prompting users. This is particularly useful for sharing the result of a - * script with other entities as a variable. - * - * TODO: implement? - also requires support in data_signature and validateAuthenticationTemplate - */ - // source?: string; /** * `AddressData` is the most low-level variable type. It must be collected * and stored each time a script is generated (usually, a locking script). @@ -1040,7 +1053,7 @@ export interface AuthenticationTemplateAddressData } export type AuthenticationTemplateVariable = + | AuthenticationTemplateAddressData | AuthenticationTemplateHdKey | AuthenticationTemplateKey - | AuthenticationTemplateWalletData - | AuthenticationTemplateAddressData; + | AuthenticationTemplateWalletData; diff --git a/src/lib/crypto/crypto.ts b/src/lib/crypto/crypto.ts index de1c5b21..9df9bceb 100644 --- a/src/lib/crypto/crypto.ts +++ b/src/lib/crypto/crypto.ts @@ -1,6 +1,8 @@ -export * from './hmac'; -export * from './ripemd160'; -export * from './secp256k1'; -export * from './sha1'; -export * from './sha256'; -export * from './sha512'; +export * from './default-crypto-instances.js'; +export * from './hmac.js'; +export * from './ripemd160.js'; +export * from './secp256k1.js'; +export * from './secp256k1-types.js'; +export * from './sha1.js'; +export * from './sha256.js'; +export * from './sha512.js'; diff --git a/src/lib/crypto/default-crypto-instances.ts b/src/lib/crypto/default-crypto-instances.ts new file mode 100644 index 00000000..f18b7475 --- /dev/null +++ b/src/lib/crypto/default-crypto-instances.ts @@ -0,0 +1,15 @@ +import { instantiateRipemd160 } from './ripemd160.js'; +import { instantiateSecp256k1 } from './secp256k1.js'; +import { instantiateSha1 } from './sha1.js'; +import { instantiateSha256 } from './sha256.js'; +import { instantiateSha512 } from './sha512.js'; + +const [sha1, sha256, sha512, ripemd160, secp256k1] = await Promise.all([ + instantiateSha1(), + instantiateSha256(), + instantiateSha512(), + instantiateRipemd160(), + instantiateSecp256k1(), +]); + +export { ripemd160, secp256k1, sha1, sha256, sha512 }; diff --git a/src/lib/crypto/dependencies.ts b/src/lib/crypto/dependencies.ts new file mode 100644 index 00000000..50b3f595 --- /dev/null +++ b/src/lib/crypto/dependencies.ts @@ -0,0 +1,3 @@ +export { base64ToBin } from '../format/format.js'; + +export * from '../bin/bin.js'; diff --git a/src/lib/crypto/hash.bench.helper.ts b/src/lib/crypto/hash.bench.helper.ts index 69213483..3ef9acea 100644 --- a/src/lib/crypto/hash.bench.helper.ts +++ b/src/lib/crypto/hash.bench.helper.ts @@ -1,26 +1,26 @@ /* global Buffer */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement */ +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void*/ import { createHash, randomBytes } from 'crypto'; -import * as asmCrypto from 'asmcrypto.js'; +import asmCrypto from 'asmcrypto.js'; import test from 'ava'; -import * as bcrypto from 'bcrypto'; +import bcrypto from 'bcrypto'; import suite from 'chuhai'; -import * as hashJs from 'hash.js'; +import hashJs from 'hash.js'; -import { HashFunction } from '../bin/bin'; +import type { HashFunction } from '../lib'; export const benchmarkHashingFunction = ( hashFunctionName: string, hashFunctionPromise: Promise, - nodeJsAlgorithm: 'ripemd160' | 'sha256' | 'sha512' | 'sha1' + nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512' ) => { const singlePassNodeBenchmark = (inputLength: number) => { const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as | 'RIPEMD160' + | 'SHA1' | 'SHA256' - | 'SHA512' - | 'SHA1'; + | 'SHA512'; test(`node: ${hashFunctionName}: hash a ${inputLength}-byte input`, async (t) => { const hashFunction = await hashFunctionPromise; await suite(t.title, (s) => { diff --git a/src/lib/crypto/hash.browser.bench.helper.ts b/src/lib/crypto/hash.browser.bench.helper.ts index ed449f1b..9546a7ed 100644 --- a/src/lib/crypto/hash.browser.bench.helper.ts +++ b/src/lib/crypto/hash.browser.bench.helper.ts @@ -1,21 +1,20 @@ /* global window, crypto */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement */ -import * as asmCrypto from 'asmcrypto.js'; +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void */ +import asmCrypto from 'asmcrypto.js'; import suite from 'chuhai'; -import * as hashJs from 'hash.js'; +import hashJs from 'hash.js'; -import { HashFunction } from '../bin/bin'; +import type { HashFunction } from '../lib'; import { instantiateRipemd160, instantiateSha1, instantiateSha256, instantiateSha512, -} from './crypto'; +} from './crypto.js'; -// eslint-disable-next-line functional/no-return-void declare const benchError: (error: string) => void; -// eslint-disable-next-line functional/no-return-void + declare const benchComplete: () => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -122,7 +121,7 @@ const incrementalBrowserBenchmark = async ({ (s) => { let message: Uint8Array; let messageChunks: readonly Uint8Array[]; - let hash: Uint8Array | ArrayBuffer | readonly number[] | null; + let hash: ArrayBuffer | Uint8Array | readonly number[] | null; const nextCycle = () => { /** diff --git a/src/lib/crypto/hash.browser.bench.ts b/src/lib/crypto/hash.browser.bench.ts index 427e951d..4b18debb 100644 --- a/src/lib/crypto/hash.browser.bench.ts +++ b/src/lib/crypto/hash.browser.bench.ts @@ -1,4 +1,3 @@ -/* eslint-disable functional/no-expression-statement */ import { join } from 'path'; import alias from '@rollup/plugin-alias'; @@ -15,11 +14,14 @@ const prepareCode = async () => { * Suppress Rollup warning: * `Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification` */ - // eslint-disable-next-line no-console, functional/immutable-data + // eslint-disable-next-line no-console console.warn = (suppress: string) => suppress; const bundle = await rollup({ - input: join(__dirname, 'hash.browser.bench.helper.js'), + input: join( + new URL('.', import.meta.url).pathname, + 'hash.browser.bench.helper.js' + ), plugins: [ alias({ entries: { @@ -31,7 +33,7 @@ const prepareCode = async () => { nodeResolve(), ], }); - // eslint-disable-next-line no-console, require-atomic-updates, functional/immutable-data + // eslint-disable-next-line no-console, require-atomic-updates console.warn = realConsoleWarn; const result = await bundle.generate({ diff --git a/src/lib/crypto/hash.spec.helper.ts b/src/lib/crypto/hash.spec.helper.ts index ce33d23c..89b6baaf 100644 --- a/src/lib/crypto/hash.spec.helper.ts +++ b/src/lib/crypto/hash.spec.helper.ts @@ -1,30 +1,31 @@ /* global Buffer */ -/* eslint-disable functional/no-expression-statement */ +/* eslint-disable functional/no-expression-statement, functional/no-return-void */ import { createHash } from 'crypto'; import { readFileSync } from 'fs'; import { join } from 'path'; import test from 'ava'; -import * as bcrypto from 'bcrypto'; -import * as fc from 'fast-check'; -import * as hashJs from 'hash.js'; +import bcrypto from 'bcrypto'; +import fc from 'fast-check'; +import hashJs from 'hash.js'; -import { HashFunction } from '../bin/bin'; +import type { HashFunction } from '../lib'; +import { utf8ToBin } from '../lib.js'; const testLength = 10000; -const stringToCharsUint8Array = (str: string) => - new Uint8Array([...str].map((c) => c.charCodeAt(0))); - const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => fc - .array(fc.integer(0, maxUint8Number), minLength, maxLength) + .array(fc.integer({ max: maxUint8Number, min: 0 }), { + maxLength, + minLength, + }) .map((a) => Uint8Array.from(a)); export const testHashFunction = ({ abcHash, - bitcoinTsHash, + libauthHash, getEmbeddedBinary, hashFunctionName, instantiate, @@ -38,19 +39,19 @@ export const testHashFunction = ({ instantiateBytes: (webassemblyBytes: ArrayBuffer) => Promise; abcHash: Uint8Array; testHash: Uint8Array; - bitcoinTsHash: Uint8Array; - nodeJsAlgorithm: 'ripemd160' | 'sha256' | 'sha512' | 'sha1'; + libauthHash: Uint8Array; + nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512'; }) => { const binary = getEmbeddedBinary(); const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as | 'RIPEMD160' + | 'SHA1' | 'SHA256' - | 'SHA512' - | 'SHA1'; + | 'SHA512'; test(`[crypto] ${hashFunctionName} getEmbeddedBinary returns the proper binary`, (t) => { const path = join( - __dirname, + new URL('.', import.meta.url).pathname, '..', 'bin', `${hashFunctionName}`, @@ -62,12 +63,9 @@ export const testHashFunction = ({ test(`[crypto] ${hashFunctionName} instantiated with embedded binary`, async (t) => { const hashFunction = await instantiate(); - t.deepEqual(hashFunction.hash(stringToCharsUint8Array('abc')), abcHash); - t.deepEqual(hashFunction.hash(stringToCharsUint8Array('test')), testHash); - t.deepEqual( - hashFunction.hash(stringToCharsUint8Array('bitcoin-ts')), - bitcoinTsHash - ); + t.deepEqual(hashFunction.hash(utf8ToBin('abc')), abcHash); + t.deepEqual(hashFunction.hash(utf8ToBin('test')), testHash); + t.deepEqual(hashFunction.hash(utf8ToBin('libauth')), libauthHash); }); test(`[fast-check] [crypto] ${hashFunctionName} instantiated with bytes`, async (t) => { @@ -118,42 +116,33 @@ export const testHashFunction = ({ hashFunction.final( hashFunction.update( hashFunction.update( - hashFunction.update( - hashFunction.init(), - stringToCharsUint8Array('a') - ), - stringToCharsUint8Array('b') + hashFunction.update(hashFunction.init(), utf8ToBin('a')), + utf8ToBin('b') ), - stringToCharsUint8Array('c') + utf8ToBin('c') ) ), abcHash ); t.deepEqual( hashFunction.final( - hashFunction.update( - hashFunction.init(), - stringToCharsUint8Array('test') - ) + hashFunction.update(hashFunction.init(), utf8ToBin('test')) ), testHash ); t.deepEqual( hashFunction.final( hashFunction.update( - hashFunction.update( - hashFunction.init(), - stringToCharsUint8Array('bitcoin') - ), - stringToCharsUint8Array('-ts') + hashFunction.update(hashFunction.init(), utf8ToBin('lib')), + utf8ToBin('auth') ) ), - bitcoinTsHash + libauthHash ); const equivalentToSinglePass = fc.property( fcUint8Array(1, testLength), - fc.integer(1, testLength), + fc.integer({ max: testLength, min: 1 }), (message, chunkSize) => { const chunkCount = Math.ceil(message.length / chunkSize); const chunks = Array.from({ length: chunkCount }) diff --git a/src/lib/crypto/hmac.spec.ts b/src/lib/crypto/hmac.spec.ts index 61a384d7..9330b8eb 100644 --- a/src/lib/crypto/hmac.spec.ts +++ b/src/lib/crypto/hmac.spec.ts @@ -1,7 +1,6 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import { createHmac } from 'crypto'; -import test, { Macro } from 'ava'; +import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; import { @@ -9,30 +8,25 @@ import { hexToBin, hmacSha256, hmacSha512, - instantiateSha256, - instantiateSha512, -} from '../lib'; + sha256, + sha512, +} from '../lib.js'; -const sha256Promise = instantiateSha256(); -const sha512Promise = instantiateSha512(); - -const vectors: Macro<[ - { secret: string; message: string; sha256: string; sha512: string } -]> = async (t, vector) => { - const sha256 = await sha256Promise; - const sha512 = await sha512Promise; - t.deepEqual( - hmacSha256(sha256, hexToBin(vector.secret), hexToBin(vector.message)), - hexToBin(vector.sha256) - ); - t.deepEqual( - hmacSha512(sha512, hexToBin(vector.secret), hexToBin(vector.message)), - hexToBin(vector.sha512) - ); -}; -// eslint-disable-next-line functional/immutable-data -vectors.title = (title) => - `[crypto] HMAC Test Vector #${title ?? '?'} (RFC 4231)`; +const vectors = test.macro< + [{ secret: string; message: string; sha256: string; sha512: string }] +>({ + exec: (t, vector) => { + t.deepEqual( + hmacSha256(hexToBin(vector.secret), hexToBin(vector.message), sha256), + hexToBin(vector.sha256) + ); + t.deepEqual( + hmacSha512(hexToBin(vector.secret), hexToBin(vector.message), sha512), + hexToBin(vector.sha512) + ); + }, + title: (title) => `[crypto] HMAC Test Vector #${title ?? '?'} (RFC 4231)`, +}); test('1', vectors, { message: '4869205468657265', @@ -103,10 +97,9 @@ const fcUint8Array = (minLength: number, maxLength: number) => testProp( '[fast-check] [crypto] hmacSha256 is equivalent to Node.js native HMAC-SHA256', [fcUint8Array(1, 100), fcUint8Array(1, 100)], - async (t, secret, message) => { - const sha256 = await sha256Promise; + (t, secret, message) => { t.deepEqual( - binToHex(hmacSha256(sha256, secret, message)), + binToHex(hmacSha256(secret, message)), createHmac('sha256', secret).update(message).digest('hex') ); } @@ -115,10 +108,9 @@ testProp( testProp( '[fast-check] [crypto] hmacSha512 is equivalent to Node.js native HMAC-SHA512', [fcUint8Array(0, 100), fcUint8Array(0, 100)], - async (t, secret, message) => { - const sha512 = await sha512Promise; + (t, secret, message) => { t.deepEqual( - binToHex(hmacSha512(sha512, secret, message)), + binToHex(hmacSha512(secret, message)), createHmac('sha512', secret).update(message).digest('hex') ); } diff --git a/src/lib/crypto/hmac.ts b/src/lib/crypto/hmac.ts index 542f8422..8f8fd069 100644 --- a/src/lib/crypto/hmac.ts +++ b/src/lib/crypto/hmac.ts @@ -1,37 +1,38 @@ -import { flattenBinArray } from '../format/hex'; - -import { Sha256 } from './sha256'; -import { Sha512 } from './sha512'; +import { + sha256 as internalSha256, + sha512 as internalSha512, +} from '../crypto/default-crypto-instances.js'; +import { flattenBinArray } from '../format/format.js'; +import type { Sha256, Sha512 } from '../lib'; /** * Instantiate a hash-based message authentication code (HMAC) function as * specified by RFC 2104. * - * @param hashFunction - a cryptographic hash function which iterates a basic - * compression function on blocks of data + * @param hashFunction - a cryptographic hash function that iterates a basic + * compression function over blocks of data * @param blockByteLength - the byte-length of blocks used in `hashFunction` */ -export const instantiateHmacFunction = ( - hashFunction: (input: Uint8Array) => Uint8Array, - blockByteLength: number -) => (secret: Uint8Array, message: Uint8Array) => { - const key = new Uint8Array(blockByteLength).fill(0); - // eslint-disable-next-line functional/no-expression-statement - key.set(secret.length > blockByteLength ? hashFunction(secret) : secret, 0); +export const instantiateHmacFunction = + (hashFunction: (input: Uint8Array) => Uint8Array, blockByteLength: number) => + (secret: Uint8Array, message: Uint8Array) => { + const key = new Uint8Array(blockByteLength).fill(0); + // eslint-disable-next-line functional/no-expression-statement + key.set(secret.length > blockByteLength ? hashFunction(secret) : secret, 0); - const innerPaddingFill = 0x36; - const innerPadding = new Uint8Array(blockByteLength).fill(innerPaddingFill); - // eslint-disable-next-line no-bitwise - const innerPrefix = innerPadding.map((pad, index) => pad ^ key[index]); - const innerContent = flattenBinArray([innerPrefix, message]); - const innerResult = hashFunction(innerContent); + const innerPaddingFill = 0x36; + const innerPadding = new Uint8Array(blockByteLength).fill(innerPaddingFill); + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + const innerPrefix = innerPadding.map((pad, index) => pad ^ key[index]!); + const innerContent = flattenBinArray([innerPrefix, message]); + const innerResult = hashFunction(innerContent); - const outerPaddingFill = 0x5c; - const outerPadding = new Uint8Array(blockByteLength).fill(outerPaddingFill); - // eslint-disable-next-line no-bitwise - const outerPrefix = outerPadding.map((pad, index) => pad ^ key[index]); - return hashFunction(flattenBinArray([outerPrefix, innerResult])); -}; + const outerPaddingFill = 0x5c; + const outerPadding = new Uint8Array(blockByteLength).fill(outerPaddingFill); + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + const outerPrefix = outerPadding.map((pad, index) => pad ^ key[index]!); + return hashFunction(flattenBinArray([outerPrefix, innerResult])); + }; const sha256BlockByteLength = 64; @@ -43,14 +44,14 @@ const sha256BlockByteLength = 64; * use, shortening their length to the minimum recommended length (32 bytes). * See `RFC 2104` for details. * - * @param sha256 - an implementation of Sha256 * @param secret - the secret key (recommended length: 32-64 bytes) * @param message - the message to authenticate + * @param sha256 - an implementation of Sha256 */ export const hmacSha256 = ( - sha256: { hash: Sha256['hash'] }, secret: Uint8Array, - message: Uint8Array + message: Uint8Array, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => instantiateHmacFunction(sha256.hash, sha256BlockByteLength)(secret, message); @@ -64,13 +65,13 @@ const sha512BlockByteLength = 128; * use, shortening their length to the minimum recommended length (64 bytes). * See `RFC 2104` for details. * - * @param sha512 - an implementation of Sha512 * @param secret - the secret key (recommended length: 64-128 bytes) * @param message - the message to authenticate + * @param sha512 - an implementation of Sha512 */ export const hmacSha512 = ( - sha512: { hash: Sha512['hash'] }, secret: Uint8Array, - message: Uint8Array + message: Uint8Array, + sha512: { hash: Sha512['hash'] } = internalSha512 ) => instantiateHmacFunction(sha512.hash, sha512BlockByteLength)(secret, message); diff --git a/src/lib/crypto/ripemd160.bench.ts b/src/lib/crypto/ripemd160.bench.ts index 77f90dca..b7611caf 100644 --- a/src/lib/crypto/ripemd160.bench.ts +++ b/src/lib/crypto/ripemd160.bench.ts @@ -1,8 +1,8 @@ -import { instantiateRipemd160, Ripemd160 } from '../lib'; +import type { Ripemd160 } from '../lib'; +import { instantiateRipemd160 } from '../lib.js'; -import { benchmarkHashingFunction } from './hash.bench.helper'; +import { benchmarkHashingFunction } from './hash.bench.helper.js'; -// eslint-disable-next-line functional/no-expression-statement benchmarkHashingFunction( 'ripemd160', instantiateRipemd160(), diff --git a/src/lib/crypto/ripemd160.spec.ts b/src/lib/crypto/ripemd160.spec.ts index ef132aaf..9128a7a7 100644 --- a/src/lib/crypto/ripemd160.spec.ts +++ b/src/lib/crypto/ripemd160.spec.ts @@ -1,12 +1,11 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ +import type { Ripemd160 } from '../lib'; import { getEmbeddedRipemd160Binary, instantiateRipemd160, instantiateRipemd160Bytes, - Ripemd160, -} from '../lib'; +} from '../lib.js'; -import { testHashFunction } from './hash.spec.helper'; +import { testHashFunction } from './hash.spec.helper.js'; // prettier-ignore const abcHash = new Uint8Array([142, 178, 8, 247, 224, 93, 152, 122, 155, 4, 74, 142, 152, 198, 176, 135, 241, 90, 11, 252]); @@ -15,15 +14,15 @@ const abcHash = new Uint8Array([142, 178, 8, 247, 224, 93, 152, 122, 155, 4, 74, const testHash = new Uint8Array([94, 82, 254, 228, 126, 107, 7, 5, 101, 247, 67, 114, 70, 140, 220, 105, 157, 232, 145, 7]); // prettier-ignore -const bitcoinTsHash = new Uint8Array([114, 23, 190, 127, 93, 117, 57, 29, 77, 27, 233, 75, 218, 102, 121, 213, 45, 101, 210, 199]); +const libauthHash = new Uint8Array([110, 49, 102, 23, 96, 92, 29, 1, 244, 107, 255, 233, 7, 87, 156, 120, 131, 157, 28, 239]); testHashFunction({ abcHash, - bitcoinTsHash, getEmbeddedBinary: getEmbeddedRipemd160Binary, hashFunctionName: 'ripemd160', instantiate: instantiateRipemd160, instantiateBytes: instantiateRipemd160Bytes, + libauthHash, nodeJsAlgorithm: 'ripemd160', testHash, }); diff --git a/src/lib/crypto/ripemd160.ts b/src/lib/crypto/ripemd160.ts index 93cdfe16..51c6903a 100644 --- a/src/lib/crypto/ripemd160.ts +++ b/src/lib/crypto/ripemd160.ts @@ -1,9 +1,10 @@ +import type { HashFunction } from '../lib'; + import { - HashFunction, + base64ToBin, instantiateRustWasm, ripemd160Base64Bytes, -} from '../bin/bin'; -import { base64ToBin } from '../format/format'; +} from './dependencies.js'; export interface Ripemd160 extends HashFunction { /** @@ -44,7 +45,7 @@ export interface Ripemd160 extends HashFunction { /** * Add input to an incremental ripemd160 hashing computation. * - * Returns a raw state which can again be passed to `update` with additional + * Returns a raw state that can again be passed to `update` with additional * input to continue the computation. * * When the computation has been updated with all input, pass the raw state to @@ -58,7 +59,7 @@ export interface Ripemd160 extends HashFunction { /** * The most performant way to instantiate ripemd160 functionality. To avoid - * using Node.js or DOM-specific APIs, you can use `instantiateRipemd160`. + * using Node.js or DOM-specific APIs, you can use {@link instantiateRipemd160}. * * @param webassemblyBytes - A buffer containing the ripemd160 binary. */ @@ -84,18 +85,10 @@ export const instantiateRipemd160Bytes = async ( export const getEmbeddedRipemd160Binary = () => base64ToBin(ripemd160Base64Bytes).buffer; -const cachedRipemd160: { cache?: Promise } = {}; - /** - * An ultimately-portable (but slower) version of `instantiateRipemd160Bytes` - * which does not require the consumer to provide the ripemd160 binary buffer. + * An ultimately-portable (but slower) version of + * {@link instantiateRipemd160Bytes} that does not require the consumer to + * provide the ripemd160 binary buffer. */ -export const instantiateRipemd160 = async (): Promise => { - if (cachedRipemd160.cache !== undefined) { - return cachedRipemd160.cache; - } - const result = instantiateRipemd160Bytes(getEmbeddedRipemd160Binary()); - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement - cachedRipemd160.cache = result; - return result; -}; +export const instantiateRipemd160 = async (): Promise => + instantiateRipemd160Bytes(getEmbeddedRipemd160Binary()); diff --git a/src/lib/crypto/secp256k1-types.ts b/src/lib/crypto/secp256k1-types.ts index 0ee1d4c1..39d15bf7 100644 --- a/src/lib/crypto/secp256k1-types.ts +++ b/src/lib/crypto/secp256k1-types.ts @@ -6,36 +6,25 @@ export interface RecoverableSignature { } /** - * An object which exposes a set of purely-functional Secp256k1 methods. - * - * Under the hood, this object uses a [[Secp256k1Wasm]] instance to provide it's - * functionality. Because WebAssembly modules are dynamically-instantiated at - * runtime, this object must be created and awaited from `instantiateSecp256k1` - * or `instantiateSecp256k1Bytes`. - * - * **These methods do not check the length of provided parameters. Calling them - * with improperly-sized parameters will likely cause incorrect behavior or - * runtime errors.** + * An object that exposes a set of purely-functional Secp256k1 methods. * * ## Example * * ```typescript - * import { instantiateSecp256k1 } from '@bitauth/libauth'; + * import { secp256k1 } from '@bitauth/libauth'; * import { msgHash, pubkey, sig } from './somewhere'; * - * (async () => { - * const secp256k1 = await instantiateSecp256k1(); - * secp256k1.verifySignatureDERLowS(sig, pubkey, msgHash) - * ? console.log('🚀 Signature valid') - * : console.log('❌ Signature invalid'); - * })(); + * secp256k1.verifySignatureDERLowS(sig, pubkey, msgHash) + * ? console.log('🚀 Signature valid') + * : console.log('❌ Signature invalid'); * ``` */ export interface Secp256k1 { /** * Tweak a privateKey by adding `tweakValue` to it. * - * Throws if the private key is invalid or if the addition failed. + * Returns an error message if the private key is invalid or if the addition + * fails. * * @param privateKey - a valid secp256k1 private key * @param tweakValue - 256 bit value to tweak by (BE) @@ -43,13 +32,13 @@ export interface Secp256k1 { readonly addTweakPrivateKey: ( privateKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Tweak a `publicKey` by adding `tweakValue` times the generator to it. * - * Throws if the provided public key could not be parsed, is not valid or if - * the addition failed. + * Returns an error message if the provided public key could not be parsed or + * is not valid, or if the addition failed. * * The returned public key will be in compressed format. * @@ -59,13 +48,13 @@ export interface Secp256k1 { readonly addTweakPublicKeyCompressed: ( publicKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Tweak a `publicKey` by adding `tweakValue` times the generator to it. * - * Throws if the provided public key could not be parsed, is not valid or if - * the addition failed. + * Returns an error message if the provided public key could not be parsed or + * is not valid, or if the addition failed. * * The returned public key will be in uncompressed format. * @@ -75,7 +64,7 @@ export interface Secp256k1 { readonly addTweakPublicKeyUncompressed: ( publicKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Compress a valid ECDSA public key. Returns a public key in compressed @@ -85,60 +74,72 @@ export interface Secp256k1 { * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, * header byte 0x06 or 0x07) format public keys. * - * Throws if the provided public key could not be parsed or is not valid. + * Returns an error message if the provided public key could not be parsed or + * is not valid. * * @param privateKey - a public key to compress */ - readonly compressPublicKey: (publicKey: Uint8Array) => Uint8Array; + readonly compressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Derive a compressed public key from a valid secp256k1 private key. * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyCompressed: (privateKey: Uint8Array) => Uint8Array; + readonly derivePublicKeyCompressed: ( + privateKey: Uint8Array + ) => Uint8Array | string; /** * Derive an uncompressed public key from a valid secp256k1 private key. * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyUncompressed: (privateKey: Uint8Array) => Uint8Array; + readonly derivePublicKeyUncompressed: ( + privateKey: Uint8Array + ) => Uint8Array | string; /** * Malleate a compact-encoded ECDSA signature. * * This is done by negating the S value modulo the order of the curve, - * "flipping" the sign of the random point R which is not included in the + * "flipping" the sign of the random point R that is not included in the * signature. * - * Throws if compact-signature parsing fails. + * Returns an error message if compact-signature parsing fails. * * @param signature - a compact-encoded ECDSA signature to malleate, max 72 * bytes */ - readonly malleateSignatureCompact: (signature: Uint8Array) => Uint8Array; + readonly malleateSignatureCompact: ( + signature: Uint8Array + ) => Uint8Array | string; /** * Malleate a DER-encoded ECDSA signature. * * This is done by negating the S value modulo the order of the curve, - * "flipping" the sign of the random point R which is not included in the + * "flipping" the sign of the random point R that is not included in the * signature. * - * Throws if DER-signature parsing fails. + * Returns an error message if DER-signature parsing fails. * * @param signature - a DER-encoded ECDSA signature to malleate, max 72 bytes */ - readonly malleateSignatureDER: (signature: Uint8Array) => Uint8Array; + readonly malleateSignatureDER: (signature: Uint8Array) => Uint8Array | string; /** * Tweak a privateKey by multiplying it by a `tweakValue`. * + * Returns an error message if the private key is invalid or if the + * multiplication fails. + * * @param privateKey - a valid secp256k1 private key * @param tweakValue - 256 bit value to tweak by (BE) * @@ -146,13 +147,14 @@ export interface Secp256k1 { readonly mulTweakPrivateKey: ( privateKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Tweak a `publicKey` by multiplying `tweakValue` to it. * - * Throws if the provided public key could not be parsed, is not valid or if - * the multiplication failed. + * Returns an error message if the provided public key could not be parsed or + * is not valid, or if the multiplication failed. + * * The returned public key will be in compressed format. * * @param publicKey - a public key. @@ -161,13 +163,14 @@ export interface Secp256k1 { readonly mulTweakPublicKeyCompressed: ( publicKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Tweak a `publicKey` by multiplying `tweakValue` to it. * - * Throws if the provided public key could not be parsed, is not valid or if - * the multiplication failed. + * Returns an error message if the provided public key could not be parsed or + * is not valid, or if the multiplication failed. + * * The returned public key will be in uncompressed format. * * @param publicKey - a public key. @@ -177,33 +180,37 @@ export interface Secp256k1 { readonly mulTweakPublicKeyUncompressed: ( publicKey: Uint8Array, tweakValue: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Normalize a compact-encoded ECDSA signature to lower-S form. * - * Throws if compact-signature parsing fails. + * Returns an error message if compact-signature parsing fails. * * @param signature - a compact-encoded ECDSA signature to normalize to * lower-S form, max 72 bytes */ - readonly normalizeSignatureCompact: (signature: Uint8Array) => Uint8Array; + readonly normalizeSignatureCompact: ( + signature: Uint8Array + ) => Uint8Array | string; /** * Normalize a DER-encoded ECDSA signature to lower-S form. * - * Throws if DER-signature parsing fails. + * Returns an error message if DER-signature parsing fails. * * @param signature - a DER-encoded ECDSA signature to normalize to lower-S * form, max 72 bytes */ - readonly normalizeSignatureDER: (signature: Uint8Array) => Uint8Array; + readonly normalizeSignatureDER: ( + signature: Uint8Array + ) => Uint8Array | string; /** * Compute a compressed public key from a valid signature, recovery number, * and the `messageHash` used to generate them. * - * Throws if the provided arguments are mismatched. + * Returns an error message if the provided arguments are mismatched. * * @param signature - an ECDSA signature in compact format * @param recovery - the recovery number @@ -214,13 +221,13 @@ export interface Secp256k1 { signature: Uint8Array, recoveryId: RecoveryId, messageHash: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Compute an uncompressed public key from a valid signature, recovery * number, and the `messageHash` used to generate them. * - * Throws if the provided arguments are mismatched. + * Returns an error message if the provided arguments are mismatched. * * @param signature - an ECDSA signature in compact format * @param recovery - the recovery number @@ -231,31 +238,36 @@ export interface Secp256k1 { signature: Uint8Array, recoveryId: RecoveryId, messageHash: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Convert a compact-encoded ECDSA signature to DER encoding. * - * Throws if parsing of compact-encoded signature fails. + * Returns an error message if parsing of compact-encoded signature fails. * * @param signature - a compact-encoded ECDSA signature to convert */ - readonly signatureCompactToDER: (signature: Uint8Array) => Uint8Array; + readonly signatureCompactToDER: ( + signature: Uint8Array + ) => Uint8Array | string; /** * Convert a DER-encoded ECDSA signature to compact encoding. * - * Throws if parsing of DER-encoded signature fails. + * Returns an error message if parsing of DER-encoded signature fails. * * @param signature - a DER-encoded ECDSA signature to convert */ - readonly signatureDERToCompact: (signature: Uint8Array) => Uint8Array; + readonly signatureDERToCompact: ( + signature: Uint8Array + ) => Uint8Array | string; /** * Create an ECDSA signature in compact format. The created signature is * always in lower-S form and follows RFC 6979. * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1 private key * @param messageHash - the 32-byte message hash to be signed @@ -263,13 +275,14 @@ export interface Secp256k1 { readonly signMessageHashCompact: ( privateKey: Uint8Array, messageHash: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Create an ECDSA signature in DER format. The created signature is always in * lower-S form and follows RFC 6979. * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed @@ -277,7 +290,7 @@ export interface Secp256k1 { readonly signMessageHashDER: ( privateKey: Uint8Array, messageHash: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Create an ECDSA signature in compact format. The created signature is @@ -286,7 +299,8 @@ export interface Secp256k1 { * Also returns a recovery number for use in the `recoverPublicKey*` * functions * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed @@ -294,10 +308,10 @@ export interface Secp256k1 { readonly signMessageHashRecoverableCompact: ( privateKey: Uint8Array, messageHash: Uint8Array - ) => RecoverableSignature; + ) => RecoverableSignature | string; /** - * Create a Secp256k1 EC-Schnorr-SHA256 signature (BCH construction). + * Create a Secp256k1 EC-Schnorr-SHA256 signature (Bitcoin Cash construction). * * Signatures are 64-bytes, non-malleable, and support both batch validation * and multiparty signing. Nonces are generated using RFC6979, where the @@ -305,7 +319,8 @@ export interface Secp256k1 { * This avoids leaking a private key by inadvertently creating both an ECDSA * signature and a Schnorr signature using the same nonce. * - * Throws if the provided private key is too large (see `validatePrivateKey`). + * Returns an error message if the provided private key is too large (see + * `validatePrivateKey`). * * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed @@ -313,7 +328,7 @@ export interface Secp256k1 { readonly signMessageHashSchnorr: ( privateKey: Uint8Array, messageHash: Uint8Array - ) => Uint8Array; + ) => Uint8Array | string; /** * Uncompress a valid ECDSA public key. Returns a public key in uncompressed @@ -323,11 +338,12 @@ export interface Secp256k1 { * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, * header byte 0x06 or 0x07) format public keys. * - * Throws if the provided public key could not be parsed or is not valid. + * Returns an error message if the provided public key could not be parsed or + * is not valid. * * @param publicKey - a public key to uncompress */ - readonly uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array; + readonly uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Verify that a private key is valid for secp256k1. Note, this library @@ -336,7 +352,7 @@ export interface Secp256k1 { * * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, * any 256-bit number greater than or equal to `0x01` and less than - * `0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140` + * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` * is a valid private key. This range is part of the definition of the * secp256k1 elliptic curve parameters. * @@ -416,7 +432,7 @@ export interface Secp256k1 { ) => boolean; /** - * Verify a Secp256k1 EC-Schnorr-SHA256 signature (BCH construction). + * Verify a Secp256k1 EC-Schnorr-SHA256 signature (Bitcoin Cash construction). * * @param signature - a 64-byte schnorr signature to verify * @param publicKey - a public key, in either compressed (33-byte) or diff --git a/src/lib/crypto/secp256k1.bench.ts b/src/lib/crypto/secp256k1.bench.ts index 39460772..a3a2f7f5 100644 --- a/src/lib/crypto/secp256k1.bench.ts +++ b/src/lib/crypto/secp256k1.bench.ts @@ -1,12 +1,12 @@ -/* eslint-disable functional/no-expression-statement, functional/no-let, @typescript-eslint/init-declarations, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ import { randomBytes } from 'crypto'; import test from 'ava'; import suite from 'chuhai'; -import * as elliptic from 'elliptic'; -import * as secp256k1Node from 'secp256k1'; +import elliptic from 'elliptic'; +import secp256k1Node from 'secp256k1'; -import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib'; +import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib.js'; const secp256k1Promise = instantiateSecp256k1(); @@ -37,12 +37,14 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) const nextCycle = () => { const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); - pubkeyUncompressed = secp256k1.derivePublicKeyUncompressed(privKey); + pubkeyUncompressed = secp256k1.derivePublicKeyUncompressed( + privKey + ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyUncompressed), 'hex' ); - sigDER = secp256k1.signMessageHashDER(privKey, messageHash); + sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; }; nextCycle(); @@ -83,12 +85,14 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => const nextCycle = () => { const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); - pubkeyCompressed = secp256k1.derivePublicKeyCompressed(privKey); + pubkeyCompressed = secp256k1.derivePublicKeyCompressed( + privKey + ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyCompressed), 'hex' ); - sigDER = secp256k1.signMessageHashDER(privKey, messageHash); + sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; }; nextCycle(); @@ -126,11 +130,15 @@ test('bench: secp256k1: derive compressed pubkey', async (t) => { let pubkeyCompressedBenchmark: Uint8Array; const nextCycle = () => { privKey = generatePrivateKey(secureRandom); - pubkeyCompressedExpected = secp256k1.derivePublicKeyCompressed(privKey); + pubkeyCompressedExpected = secp256k1.derivePublicKeyCompressed( + privKey + ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { - pubkeyCompressedBenchmark = secp256k1.derivePublicKeyCompressed(privKey); + pubkeyCompressedBenchmark = secp256k1.derivePublicKeyCompressed( + privKey + ) as Uint8Array; }); s.bench('elliptic', () => { pubkeyCompressedBenchmark = Uint8Array.from( @@ -157,17 +165,22 @@ test('bench: secp256k1: create DER Low-S signature', async (t) => { const nextCycle = () => { privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); - sigDERExpected = secp256k1.signMessageHashDER(privKey, messageHash); + sigDERExpected = secp256k1.signMessageHashDER( + privKey, + messageHash + ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { - sigDERBenchmark = secp256k1.signMessageHashDER(privKey, messageHash); + sigDERBenchmark = secp256k1.signMessageHashDER( + privKey, + messageHash + ) as Uint8Array; }); s.bench('elliptic', () => { - sigDERBenchmark = ellipticEc - .keyFromPrivate(privKey) - .sign(messageHash) - .toDER(); + sigDERBenchmark = Uint8Array.from( + ellipticEc.keyFromPrivate(privKey).sign(messageHash).toDER() + ); }); s.bench('secp256k1-node', () => { sigDERBenchmark = secp256k1Node.signatureExport( @@ -202,23 +215,29 @@ test('bench: secp256k1: sign: Schnorr vs. ECDSA', async (t) => { const nextCycle = () => { privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); - sigDERExpected = secp256k1.signMessageHashDER(privKey, messageHash); + sigDERExpected = secp256k1.signMessageHashDER( + privKey, + messageHash + ) as Uint8Array; sigSchnorrExpected = secp256k1.signMessageHashSchnorr( privKey, messageHash - ); + ) as Uint8Array; }; nextCycle(); s.bench('secp256k1.signMessageHashDER', () => { isSchnorr = false; - sigDERBenchmark = secp256k1.signMessageHashDER(privKey, messageHash); + sigDERBenchmark = secp256k1.signMessageHashDER( + privKey, + messageHash + ) as Uint8Array; }); s.bench('secp256k1.signMessageHashSchnorr', () => { isSchnorr = true; sigSchnorrBenchmark = secp256k1.signMessageHashSchnorr( privKey, messageHash - ); + ) as Uint8Array; }); s.cycle(() => { if (isSchnorr) { @@ -243,9 +262,14 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { const nextCycle = () => { const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); - pubkeyCompressed = secp256k1.derivePublicKeyCompressed(privKey); - sigDER = secp256k1.signMessageHashDER(privKey, messageHash); - sigSchnorr = secp256k1.signMessageHashSchnorr(privKey, messageHash); + pubkeyCompressed = secp256k1.derivePublicKeyCompressed( + privKey + ) as Uint8Array; + sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; + sigSchnorr = secp256k1.signMessageHashSchnorr( + privKey, + messageHash + ) as Uint8Array; result = false; }; nextCycle(); diff --git a/src/lib/crypto/secp256k1.spec.ts b/src/lib/crypto/secp256k1.spec.ts index 81d0aceb..55c1a541 100644 --- a/src/lib/crypto/secp256k1.spec.ts +++ b/src/lib/crypto/secp256k1.spec.ts @@ -1,20 +1,22 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers, max-lines, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable max-lines, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument */ // cspell:ignore recid /* global Buffer */ import { randomBytes } from 'crypto'; import test from 'ava'; -import * as elliptic from 'elliptic'; -import * as fc from 'fast-check'; -import * as secp256k1Node from 'secp256k1'; +import elliptic from 'elliptic'; +import fc from 'fast-check'; +import secp256k1Node from 'secp256k1'; +import type { RecoverableSignature } from '../lib.js'; import { getEmbeddedSecp256k1Binary, instantiateSecp256k1, instantiateSecp256k1Bytes, - Secp256k1, -} from '../lib'; + secp256k1 as internalSecp256k1, + Secp256k1Error, +} from '../lib.js'; // test vectors (from `zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong`, m/0 and m/1): @@ -108,13 +110,12 @@ const ellipticCheckSignature = ( // fast-check helpers const fcUint8Array = (minLength: number, maxLength: number) => fc - .array(fc.integer(0, 255), minLength, maxLength) + .array(fc.integer({ max: 255, min: 0 }), { maxLength, minLength }) .map((a) => Uint8Array.from(a)); const fcUint8Array32 = () => fcUint8Array(32, 32); -const fcValidPrivateKey = (secp256k1: Secp256k1) => - fcUint8Array32().filter((generated) => - secp256k1.validatePrivateKey(generated) - ); +const fcValidPrivateKey = fcUint8Array32().filter((generated) => + internalSecp256k1.validatePrivateKey(generated) +); test('[crypto] instantiateSecp256k1 with binary', async (t) => { const secp256k1 = await instantiateSecp256k1Bytes(binary); @@ -136,13 +137,16 @@ test('[crypto] secp256k1.addTweakPrivateKey', async (t) => { secp256k1.addTweakPrivateKey(privkey, keyTweakVal), privkeyTweakedAdd ); - t.throws(() => secp256k1.addTweakPrivateKey(privkey, Buffer.alloc(32, 255))); + t.deepEqual( + secp256k1.addTweakPrivateKey(privkey, Buffer.alloc(32, 255)), + Secp256k1Error.addTweakPrivateKey + ); }); test('[fast-check] [crypto] secp256k1.addTweakPrivateKey', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.addTweakPrivateKey(privateKey, keyTweakVal), @@ -152,36 +156,47 @@ test('[fast-check] [crypto] secp256k1.addTweakPrivateKey', async (t) => { ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.addTweakPublicKeyCompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.addTweakPublicKeyCompressed', (t) => { t.deepEqual( - secp256k1.addTweakPublicKeyCompressed(pubkeyCompressed, keyTweakVal), + internalSecp256k1.addTweakPublicKeyCompressed( + pubkeyCompressed, + keyTweakVal + ), pubkeyTweakedAddCompressed ); - t.throws(() => { - secp256k1.addTweakPublicKeyCompressed(new Uint8Array(65), keyTweakVal); - }); - t.throws(() => { - secp256k1.addTweakPublicKeyCompressed( + t.deepEqual( + internalSecp256k1.addTweakPublicKeyCompressed( + new Uint8Array(65), + keyTweakVal + ), + Secp256k1Error.unparsablePublicKey + ); + t.deepEqual( + internalSecp256k1.addTweakPublicKeyCompressed( pubkeyCompressed, Buffer.alloc(32, 255) - ); - }); + ), + Secp256k1Error.addTweakPublicKey + ); }); test('[fast-check] [crypto] secp256k1.addTweakPublicKeyCompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); + const pubkeyC = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( @@ -190,36 +205,47 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyCompressed', async (t) => ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.addTweakPublicKeyUncompressed', (t) => { t.deepEqual( - secp256k1.addTweakPublicKeyUncompressed(pubkeyUncompressed, keyTweakVal), + internalSecp256k1.addTweakPublicKeyUncompressed( + pubkeyUncompressed, + keyTweakVal + ), pubkeyTweakedAddUncompressed ); - t.throws(() => { - secp256k1.addTweakPublicKeyUncompressed(new Uint8Array(65), keyTweakVal); - }); - t.throws(() => { - secp256k1.addTweakPublicKeyUncompressed( + t.deepEqual( + internalSecp256k1.addTweakPublicKeyUncompressed( + new Uint8Array(65), + keyTweakVal + ), + Secp256k1Error.unparsablePublicKey + ); + t.deepEqual( + internalSecp256k1.addTweakPublicKeyUncompressed( pubkeyCompressed, Buffer.alloc(32, 255) - ); - }); + ), + Secp256k1Error.addTweakPublicKey + ); }); test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( @@ -228,39 +254,46 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.compressPublicKey', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.compressPublicKey', (t) => { t.deepEqual( - secp256k1.compressPublicKey(pubkeyUncompressed), + internalSecp256k1.compressPublicKey(pubkeyUncompressed), pubkeyCompressed ); - t.throws(() => secp256k1.compressPublicKey(new Uint8Array(65))); + t.deepEqual( + internalSecp256k1.compressPublicKey(new Uint8Array(65)), + Secp256k1Error.unparsablePublicKey + ); }); test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { const secp256k1 = await secp256k1Promise; - const reversesUncompress = fc.property( - fcValidPrivateKey(secp256k1), - (privateKey) => { - const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); - t.deepEqual( - pubkeyC, - secp256k1.compressPublicKey(secp256k1.uncompressPublicKey(pubkeyC)) - ); - } - ); + const reversesUncompress = fc.property(fcValidPrivateKey, (privateKey) => { + const pubkeyC = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; + t.deepEqual( + pubkeyC, + secp256k1.compressPublicKey( + secp256k1.uncompressPublicKey(pubkeyC) as Uint8Array + ) + ); + }); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; t.deepEqual( secp256k1.compressPublicKey(pubkeyU), new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyU, true)) @@ -268,16 +301,15 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { } ); - const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), - (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); - t.deepEqual( - secp256k1.compressPublicKey(pubkeyU), - new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()) - ); - } - ); + const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; + t.deepEqual( + secp256k1.compressPublicKey(pubkeyU), + new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()) + ); + }); t.notThrows(() => { fc.assert(reversesUncompress); fc.assert(equivalentToSecp256k1Node); @@ -285,25 +317,32 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { }); }); -test('[crypto] secp256k1.derivePublicKeyCompressed', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.derivePublicKeyCompressed(privkey), pubkeyCompressed); - t.throws(() => secp256k1.derivePublicKeyCompressed(secp256k1OrderN)); +test('[crypto] secp256k1.derivePublicKeyCompressed', (t) => { + t.deepEqual( + internalSecp256k1.derivePublicKeyCompressed(privkey), + pubkeyCompressed + ); + t.deepEqual( + internalSecp256k1.derivePublicKeyCompressed(secp256k1OrderN), + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + ); }); test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { const secp256k1 = await secp256k1Promise; const isEquivalentToDeriveUncompressedThenCompress = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); t.deepEqual(pubkeyC, secp256k1.compressPublicKey(pubkeyU)); } ); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyCompressed(privateKey), @@ -312,15 +351,12 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { } ); - const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), - (privateKey) => { - t.deepEqual( - secp256k1.derivePublicKeyCompressed(privateKey), - setupElliptic(privateKey).pubCompressed - ); - } - ); + const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { + t.deepEqual( + secp256k1.derivePublicKeyCompressed(privateKey), + setupElliptic(privateKey).pubCompressed + ); + }); t.notThrows(() => { fc.assert(isEquivalentToDeriveUncompressedThenCompress); fc.assert(equivalentToSecp256k1Node); @@ -328,28 +364,32 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { }); }); -test('[crypto] secp256k1.derivePublicKeyUncompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.derivePublicKeyUncompressed', (t) => { t.deepEqual( - secp256k1.derivePublicKeyUncompressed(privkey), + internalSecp256k1.derivePublicKeyUncompressed(privkey), pubkeyUncompressed ); - t.throws(() => secp256k1.derivePublicKeyUncompressed(secp256k1OrderN)); + t.deepEqual( + internalSecp256k1.derivePublicKeyUncompressed(secp256k1OrderN), + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + ); }); test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => { const secp256k1 = await secp256k1Promise; const isEquivalentToDeriveCompressedThenUncompress = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); + const pubkeyC = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); t.deepEqual(pubkeyU, secp256k1.uncompressPublicKey(pubkeyC)); } ); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyUncompressed(privateKey), @@ -358,15 +398,12 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => } ); - const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), - (privateKey) => { - t.deepEqual( - secp256k1.derivePublicKeyUncompressed(privateKey), - setupElliptic(privateKey).pubUncompressed - ); - } - ); + const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { + t.deepEqual( + secp256k1.derivePublicKeyUncompressed(privateKey), + setupElliptic(privateKey).pubUncompressed + ); + }); t.notThrows(() => { fc.assert(isEquivalentToDeriveCompressedThenUncompress); fc.assert(equivalentToSecp256k1Node); @@ -374,23 +411,27 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => }); }); -test('[crypto] secp256k1.malleateSignatureDER', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.malleateSignatureDER(sigDER), sigDERHighS); +test('[crypto] secp256k1.malleateSignatureDER', (t) => { + t.deepEqual(internalSecp256k1.malleateSignatureDER(sigDER), sigDERHighS); }); test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { const secp256k1 = await secp256k1Promise; const malleationIsJustNegation = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, message) => { const { key } = setupElliptic(privateKey); - const pubkey = secp256k1.derivePublicKeyCompressed(privateKey); - const sig = secp256k1.signMessageHashDER(privateKey, message); + const pubkey = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; + const sig = secp256k1.signMessageHashDER( + privateKey, + message + ) as Uint8Array; t.true(secp256k1.verifySignatureDERLowS(sig, pubkey, message)); t.true(ellipticCheckSignature(sig, key, message)); - const malleated = secp256k1.malleateSignatureDER(sig); + const malleated = secp256k1.malleateSignatureDER(sig) as Uint8Array; t.true(secp256k1.verifySignatureDER(malleated, pubkey, message)); t.true(ellipticCheckSignature(malleated, key, message)); t.false(secp256k1.verifySignatureDERLowS(malleated, pubkey, message)); @@ -402,26 +443,35 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { }); }); -test('[crypto] secp256k1.malleateSignatureCompact', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.malleateSignatureCompact(sigCompact), sigCompactHighS); +test('[crypto] secp256k1.malleateSignatureCompact', (t) => { + t.deepEqual( + internalSecp256k1.malleateSignatureCompact(sigCompact), + sigCompactHighS + ); }); test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { const secp256k1 = await secp256k1Promise; const malleationIsJustNegation = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, message) => { - const pubkey = secp256k1.derivePublicKeyCompressed(privateKey); - const sig = secp256k1.signMessageHashCompact(privateKey, message); + const pubkey = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; + const sig = secp256k1.signMessageHashCompact( + privateKey, + message + ) as Uint8Array; t.true(secp256k1.verifySignatureCompactLowS(sig, pubkey, message)); t.true(secp256k1Node.ecdsaVerify(sig, message, pubkey)); - const malleated = secp256k1.malleateSignatureCompact(sig); + const malleated = secp256k1.malleateSignatureCompact(sig) as Uint8Array; t.true(secp256k1.verifySignatureCompact(malleated, pubkey, message)); t.false(secp256k1.verifySignatureCompactLowS(malleated, pubkey, message)); t.false(secp256k1Node.ecdsaVerify(malleated, message, pubkey)); - const malleatedMalleated = secp256k1.malleateSignatureCompact(malleated); + const malleatedMalleated = secp256k1.malleateSignatureCompact( + malleated + ) as Uint8Array; t.true(secp256k1Node.ecdsaVerify(malleatedMalleated, message, pubkey)); t.true( secp256k1.verifySignatureCompactLowS( @@ -438,19 +488,21 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { }); }); -test('[crypto] secp256k1.mulTweakPrivateKey', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.mulTweakPrivateKey', (t) => { t.deepEqual( - secp256k1.mulTweakPrivateKey(privkey, keyTweakVal), + internalSecp256k1.mulTweakPrivateKey(privkey, keyTweakVal), privkeyTweakedMul ); - t.throws(() => secp256k1.mulTweakPrivateKey(privkey, Buffer.alloc(32, 255))); + t.deepEqual( + internalSecp256k1.mulTweakPrivateKey(privkey, Buffer.alloc(32, 255)), + Secp256k1Error.mulTweakPrivateKey + ); }); test('[fast-check] [crypto] secp256k1.mulTweakPrivateKey', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.mulTweakPrivateKey(privateKey, keyTweakVal), @@ -460,36 +512,47 @@ test('[fast-check] [crypto] secp256k1.mulTweakPrivateKey', async (t) => { ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.mulTweakPublicKeyCompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.mulTweakPublicKeyCompressed', (t) => { t.deepEqual( - secp256k1.mulTweakPublicKeyCompressed(pubkeyCompressed, keyTweakVal), + internalSecp256k1.mulTweakPublicKeyCompressed( + pubkeyCompressed, + keyTweakVal + ), pubkeyTweakedMulCompressed ); - t.throws(() => { - secp256k1.mulTweakPublicKeyCompressed(new Uint8Array(65), keyTweakVal); - }); - t.throws(() => { - secp256k1.mulTweakPublicKeyCompressed( + t.deepEqual( + internalSecp256k1.mulTweakPublicKeyCompressed( + new Uint8Array(65), + keyTweakVal + ), + Secp256k1Error.unparsablePublicKey + ); + t.deepEqual( + internalSecp256k1.mulTweakPublicKeyCompressed( pubkeyCompressed, Buffer.alloc(32, 255) - ); - }); + ), + Secp256k1Error.mulTweakPublicKey + ); }); test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyCompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); + const pubkeyC = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( @@ -498,36 +561,47 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyCompressed', async (t) => ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.mulTweakPublicKeyUncompressed', (t) => { t.deepEqual( - secp256k1.mulTweakPublicKeyUncompressed(pubkeyUncompressed, keyTweakVal), + internalSecp256k1.mulTweakPublicKeyUncompressed( + pubkeyUncompressed, + keyTweakVal + ), pubkeyTweakedMulUncompressed ); - t.throws(() => { - secp256k1.mulTweakPublicKeyUncompressed(new Uint8Array(65), keyTweakVal); - }); - t.throws(() => { - secp256k1.mulTweakPublicKeyUncompressed( + t.deepEqual( + internalSecp256k1.mulTweakPublicKeyUncompressed( + new Uint8Array(65), + keyTweakVal + ), + Secp256k1Error.unparsablePublicKey + ); + t.deepEqual( + internalSecp256k1.mulTweakPublicKeyUncompressed( pubkeyCompressed, Buffer.alloc(32, 255) - ); - }); + ), + Secp256k1Error.mulTweakPublicKey + ); }); test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( @@ -536,40 +610,50 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); /* * the elliptic library doesn't implement public or private key tweaking. * perhaps future tests can do the math in JavaScript and compare with that. */ }); -test('[crypto] secp256k1.normalizeSignatureCompact', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.normalizeSignatureCompact(sigCompactHighS), sigCompact); +test('[crypto] secp256k1.normalizeSignatureCompact', (t) => { + t.deepEqual( + internalSecp256k1.normalizeSignatureCompact(sigCompactHighS), + sigCompact + ); }); test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { const secp256k1 = await secp256k1Promise; const malleateThenNormalizeEqualsInitial = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashCompact(privateKey, hash); + const sig = secp256k1.signMessageHashCompact( + privateKey, + hash + ) as Uint8Array; t.deepEqual( sig, secp256k1.normalizeSignatureCompact( - secp256k1.malleateSignatureCompact(sig) + secp256k1.malleateSignatureCompact(sig) as Uint8Array ) ); } ); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashCompact(privateKey, hash); - const malleated = secp256k1.malleateSignatureCompact(sig); + const sig = secp256k1.signMessageHashCompact( + privateKey, + hash + ) as Uint8Array; + const malleated = secp256k1.malleateSignatureCompact(sig) as Uint8Array; t.deepEqual( secp256k1.normalizeSignatureCompact(malleated), new Uint8Array(secp256k1Node.signatureNormalize(malleated)) @@ -583,31 +667,32 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { }); }); -test('[crypto] secp256k1.normalizeSignatureDER', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.normalizeSignatureDER(sigDERHighS), sigDER); +test('[crypto] secp256k1.normalizeSignatureDER', (t) => { + t.deepEqual(internalSecp256k1.normalizeSignatureDER(sigDERHighS), sigDER); }); test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { const secp256k1 = await secp256k1Promise; const malleateThenNormalizeEqualsInitial = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashDER(privateKey, hash); + const sig = secp256k1.signMessageHashDER(privateKey, hash) as Uint8Array; t.deepEqual( sig, - secp256k1.normalizeSignatureDER(secp256k1.malleateSignatureDER(sig)) + secp256k1.normalizeSignatureDER( + secp256k1.malleateSignatureDER(sig) as Uint8Array + ) ); } ); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashDER(privateKey, hash); - const malleated = secp256k1.malleateSignatureDER(sig); + const sig = secp256k1.signMessageHashDER(privateKey, hash) as Uint8Array; + const malleated = secp256k1.malleateSignatureDER(sig) as Uint8Array; t.deepEqual( secp256k1.normalizeSignatureDER(malleated), new Uint8Array( @@ -627,35 +712,44 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { }); }); -test('[crypto] secp256k1.recoverPublicKeyCompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.recoverPublicKeyCompressed', (t) => { t.deepEqual( - secp256k1.recoverPublicKeyCompressed(sigCompact, sigRecovery, messageHash), + internalSecp256k1.recoverPublicKeyCompressed( + sigCompact, + sigRecovery, + messageHash + ), pubkeyCompressed ); - t.throws(() => - secp256k1.recoverPublicKeyCompressed( + t.deepEqual( + internalSecp256k1.recoverPublicKeyCompressed( new Uint8Array(64).fill(255), sigRecovery, messageHash - ) + ), + Secp256k1Error.recoverPublicKeyWithUnparsableSignature ); const failRecover = 2; - t.throws(() => - secp256k1.recoverPublicKeyCompressed(sigCompact, failRecover, messageHash) + t.deepEqual( + internalSecp256k1.recoverPublicKeyCompressed( + sigCompact, + failRecover, + messageHash + ), + Secp256k1Error.recoverPublicKeyInvalidMaterial ); }); test('[fast-check] [crypto] secp256k1.recoverPublicKeyCompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, hash - ); + ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyCompressed( recoverableStuff.signature, @@ -673,13 +767,14 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyCompressed', async (t) => ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); }); -test('[crypto] secp256k1.recoverPublicKeyUncompressed', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.recoverPublicKeyUncompressed', (t) => { t.deepEqual( - secp256k1.recoverPublicKeyUncompressed( + internalSecp256k1.recoverPublicKeyUncompressed( sigCompact, sigRecovery, messageHash @@ -691,13 +786,13 @@ test('[crypto] secp256k1.recoverPublicKeyUncompressed', async (t) => { test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, hash - ); + ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyUncompressed( recoverableStuff.signature, @@ -715,24 +810,30 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) = ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); }); -test('[crypto] secp256k1.signMessageHashCompact', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.signMessageHashCompact', (t) => { t.deepEqual( - secp256k1.signMessageHashCompact(privkey, messageHash), + internalSecp256k1.signMessageHashCompact(privkey, messageHash), sigCompact ); - t.throws(() => - secp256k1.signMessageHashCompact(secp256k1OrderN, messageHash) + t.notDeepEqual( + internalSecp256k1.signMessageHashCompact(privkey, Uint8Array.of()), + sigCompact + ); + t.deepEqual( + internalSecp256k1.signMessageHashCompact(secp256k1OrderN, messageHash), + Secp256k1Error.signWithInvalidPrivateKey ); }); test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { t.deepEqual( @@ -743,14 +844,16 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { ); const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { const { key } = setupElliptic(privateKey); t.deepEqual( secp256k1.signMessageHashCompact(privateKey, hash), secp256k1.signatureDERToCompact( - secp256k1.normalizeSignatureDER(ellipticSignMessageDER(key, hash)) + secp256k1.normalizeSignatureDER( + ellipticSignMessageDER(key, hash) + ) as Uint8Array ) ); } @@ -762,16 +865,25 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { }); }); -test('[crypto] secp256k1.signMessageHashDER', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.signMessageHashDER(privkey, messageHash), sigDER); - t.throws(() => secp256k1.signMessageHashDER(secp256k1OrderN, messageHash)); +test('[crypto] secp256k1.signMessageHashDER', (t) => { + t.deepEqual( + internalSecp256k1.signMessageHashDER(privkey, messageHash), + sigDER + ); + t.notDeepEqual( + internalSecp256k1.signMessageHashDER(privkey, Uint8Array.of()), + sigDER + ); + t.deepEqual( + internalSecp256k1.signMessageHashDER(secp256k1OrderN, messageHash), + Secp256k1Error.signWithInvalidPrivateKey + ); }); test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { t.deepEqual( @@ -786,7 +898,7 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { ); const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { const { key } = setupElliptic(privateKey); @@ -803,23 +915,26 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { }); }); -test('[crypto] secp256k1.signMessageHashRecoverableCompact', async (t) => { - const secp256k1 = await secp256k1Promise; - const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( +test('[crypto] secp256k1.signMessageHashRecoverableCompact', (t) => { + const recoverableStuff = internalSecp256k1.signMessageHashRecoverableCompact( privkey, messageHash - ); + ) as RecoverableSignature; t.is(recoverableStuff.recoveryId, sigRecovery); t.deepEqual(recoverableStuff.signature, sigCompact); - t.throws(() => - secp256k1.signMessageHashRecoverableCompact(secp256k1OrderN, messageHash) + t.deepEqual( + internalSecp256k1.signMessageHashRecoverableCompact( + secp256k1OrderN, + messageHash + ), + Secp256k1Error.signWithInvalidPrivateKey ); }); test('[fast-check] [crypto] secp256k1.signMessageHashRecoverableCompact', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { const nodeRecoverableStuff = secp256k1Node.ecdsaSign(hash, privateKey); @@ -832,32 +947,37 @@ test('[fast-check] [crypto] secp256k1.signMessageHashRecoverableCompact', async ); } ); - t.notThrows(() => fc.assert(equivalentToSecp256k1Node)); + t.notThrows(() => { + fc.assert(equivalentToSecp256k1Node); + }); }); -test('[crypto] secp256k1.signatureCompactToDER', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.signatureCompactToDER(sigCompact), sigDER); +test('[crypto] secp256k1.signatureCompactToDER', (t) => { + t.deepEqual(internalSecp256k1.signatureCompactToDER(sigCompact), sigDER); }); test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { const secp256k1 = await secp256k1Promise; - const reversesCompress = fc.property( - fcValidPrivateKey(secp256k1), - (privateKey) => { - const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); - t.deepEqual( - pubkeyU, - secp256k1.uncompressPublicKey(secp256k1.compressPublicKey(pubkeyU)) - ); - } - ); + const reversesCompress = fc.property(fcValidPrivateKey, (privateKey) => { + const pubkeyU = secp256k1.derivePublicKeyUncompressed( + privateKey + ) as Uint8Array; + t.deepEqual( + pubkeyU, + secp256k1.uncompressPublicKey( + secp256k1.compressPublicKey(pubkeyU) as Uint8Array + ) + ); + }); const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashCompact(privateKey, hash); + const sig = secp256k1.signMessageHashCompact( + privateKey, + hash + ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureExport(sig)), secp256k1.signatureCompactToDER(sig) @@ -871,22 +991,22 @@ test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { }); }); -test('[crypto] secp256k1.signatureDERToCompact', async (t) => { - const secp256k1 = await secp256k1Promise; - t.deepEqual(secp256k1.signatureDERToCompact(sigDER), sigCompact); +test('[crypto] secp256k1.signatureDERToCompact', (t) => { + t.deepEqual(internalSecp256k1.signatureDERToCompact(sigDER), sigCompact); const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); - t.throws(() => { - secp256k1.signatureDERToCompact(sigDERWithBrokenEncoding); - }); + t.deepEqual( + internalSecp256k1.signatureDERToCompact(sigDERWithBrokenEncoding), + Secp256k1Error.unparsableSignature + ); }); test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), (privateKey, hash) => { - const sig = secp256k1.signMessageHashDER(privateKey, hash); + const sig = secp256k1.signMessageHashDER(privateKey, hash) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureImport(sig)), secp256k1.signatureDERToCompact(sig) @@ -898,21 +1018,25 @@ test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { }); }); -test('[crypto] secp256k1.uncompressPublicKey', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.uncompressPublicKey', (t) => { t.deepEqual( - secp256k1.uncompressPublicKey(pubkeyCompressed), + internalSecp256k1.uncompressPublicKey(pubkeyCompressed), pubkeyUncompressed ); - t.throws(() => secp256k1.uncompressPublicKey(new Uint8Array(33))); + t.deepEqual( + internalSecp256k1.uncompressPublicKey(new Uint8Array(33)), + Secp256k1Error.unparsablePublicKey + ); }); test('[fast-check] [crypto] secp256k1.uncompressPublicKey', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, (privateKey) => { - const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); + const pubkeyC = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyC, false)), secp256k1.uncompressPublicKey(pubkeyC) @@ -924,21 +1048,25 @@ test('[fast-check] [crypto] secp256k1.uncompressPublicKey', async (t) => { }); }); -test('[crypto] secp256k1.validatePrivateKey', async (t) => { - const secp256k1 = await secp256k1Promise; - t.true(secp256k1.validatePrivateKey(privkey)); - t.false(secp256k1.validatePrivateKey(secp256k1OrderN)); +test('[crypto] secp256k1.validatePrivateKey', (t) => { + t.true(internalSecp256k1.validatePrivateKey(privkey)); + t.false(internalSecp256k1.validatePrivateKey(secp256k1OrderN)); }); test('[fast-check] [crypto] secp256k1.validatePrivateKey', async (t) => { const secp256k1 = await secp256k1Promise; - // eslint-disable-next-line functional/immutable-data + + /** + * Invalid values are greater than or equal to: `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` + */ const almostInvalid = Array(15).fill(255); - // invalid >= 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140 const theRest = 32 - almostInvalid.length; const equivalentToSecp256k1Node = fc.property( fc - .array(fc.integer(0, 255), theRest, theRest) + .array(fc.integer({ max: 255, min: 0 }), { + maxLength: theRest, + minLength: theRest, + }) .map((random) => Uint8Array.from([...almostInvalid, ...random])), (privateKey) => secp256k1.validatePrivateKey(privateKey) === @@ -949,30 +1077,49 @@ test('[fast-check] [crypto] secp256k1.validatePrivateKey', async (t) => { }); }); -test('[crypto] secp256k1.validatePublicKey', async (t) => { - const secp256k1 = await secp256k1Promise; - t.true(secp256k1.validatePublicKey(pubkeyUncompressed)); - t.true(secp256k1.validatePublicKey(pubkeyCompressed)); - t.false(secp256k1.validatePublicKey(invalidPubkeyCompressed)); +test('[crypto] secp256k1.validatePublicKey', (t) => { + t.true(internalSecp256k1.validatePublicKey(pubkeyUncompressed)); + t.true(internalSecp256k1.validatePublicKey(pubkeyCompressed)); + t.false(internalSecp256k1.validatePublicKey(invalidPubkeyCompressed)); }); test.todo('[fast-check] [crypto] secp256k1.validatePublicKey'); -test('[crypto] secp256k1.verifySignatureCompact', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.verifySignatureCompact', (t) => { + t.true( + internalSecp256k1.verifySignatureCompact( + sigCompactHighS, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureCompact( + sigCompactHighS, + pubkeyCompressed, + Uint8Array.of() + ) + ); t.true( - secp256k1.verifySignatureCompact( + internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, messageHash ) ); + t.false( + internalSecp256k1.verifySignatureCompact( + Uint8Array.of(), + pubkeyCompressed, + messageHash + ) + ); }); test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -982,7 +1129,9 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { const sig = secp256k1Node.ecdsaSign(message, privateKey).signature; const testSig = invalidate ? sig.fill(0, 6, 7) : sig; const pub = compressed ? pubCompressed : pubUncompressed; - const malleated = secp256k1.malleateSignatureCompact(testSig); + const malleated = secp256k1.malleateSignatureCompact( + testSig + ) as Uint8Array; return ( secp256k1Node.ecdsaVerify(testSig, message, pub) === secp256k1.verifySignatureCompact(malleated, pub, message) @@ -991,7 +1140,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { ); const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -1000,7 +1149,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { const sig = ellipticSignMessageDER(key, message); const testSig = invalidate ? sig.fill(0, 6, 20) : sig; const pub = compressed ? pubCompressed : pubUncompressed; - const compactSig = secp256k1.signatureDERToCompact(testSig); + const compactSig = secp256k1.signatureDERToCompact(testSig) as Uint8Array; return ( ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompact(compactSig, pub, message) @@ -1014,21 +1163,41 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { }); }); -test('[crypto] secp256k1.verifySignatureCompactLowS', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.verifySignatureCompactLowS', (t) => { + t.true( + internalSecp256k1.verifySignatureCompactLowS( + sigCompact, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureCompactLowS( + Uint8Array.of(), + pubkeyCompressed, + messageHash + ) + ); t.true( - secp256k1.verifySignatureCompactLowS( + internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, messageHash ) ); + t.false( + internalSecp256k1.verifySignatureCompactLowS( + sigCompact, + pubkeyCompressed, + Uint8Array.of() + ) + ); }); test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -1046,7 +1215,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => ); const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -1054,10 +1223,10 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => const { key, pubUncompressed, pubCompressed } = setupElliptic(privateKey); const sig = secp256k1.normalizeSignatureDER( ellipticSignMessageDER(key, message) - ); + ) as Uint8Array; const testSig = invalidate ? sig.fill(0, 6, 20) : sig; const pub = compressed ? pubCompressed : pubUncompressed; - const compactSig = secp256k1.signatureDERToCompact(testSig); + const compactSig = secp256k1.signatureDERToCompact(testSig) as Uint8Array; return ( ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompactLowS(compactSig, pub, message) @@ -1071,21 +1240,69 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => }); }); -test('[crypto] secp256k1.verifySignatureDER', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.verifySignatureDER', (t) => { + t.true( + internalSecp256k1.verifySignatureDER( + sigDERHighS, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureDER( + Uint8Array.of(), + pubkeyCompressed, + messageHash + ) + ); t.true( - secp256k1.verifySignatureDER(sigDERHighS, pubkeyCompressed, messageHash) + internalSecp256k1.verifySignatureDER( + sigDERHighS, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureDER( + sigDERHighS, + pubkeyCompressed, + Uint8Array.of() + ) ); }); -test('[crypto] secp256k1.verifySignatureDERLowS', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.verifySignatureDERLowS', (t) => { t.true( - secp256k1.verifySignatureDERLowS(sigDER, pubkeyCompressed, messageHash) + internalSecp256k1.verifySignatureDERLowS( + sigDER, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureDERLowS( + Uint8Array.of(), + pubkeyCompressed, + messageHash + ) + ); + t.true( + internalSecp256k1.verifySignatureDERLowS( + sigDER, + pubkeyCompressed, + messageHash + ) + ); + t.false( + internalSecp256k1.verifySignatureDERLowS( + sigDER, + pubkeyCompressed, + Uint8Array.of() + ) ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( - secp256k1.verifySignatureDERLowS( + internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyWithBrokenEncoding, messageHash @@ -1093,7 +1310,7 @@ test('[crypto] secp256k1.verifySignatureDERLowS', async (t) => { ); const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); t.false( - secp256k1.verifySignatureDERLowS( + internalSecp256k1.verifySignatureDERLowS( sigDERWithBrokenEncoding, pubkeyCompressed, messageHash @@ -1101,7 +1318,7 @@ test('[crypto] secp256k1.verifySignatureDERLowS', async (t) => { ); const sigDERWithBadSignature = sigDER.slice().fill(0, 6, 7); t.false( - secp256k1.verifySignatureDERLowS( + internalSecp256k1.verifySignatureDERLowS( sigDERWithBadSignature, pubkeyCompressed, messageHash @@ -1112,7 +1329,7 @@ test('[crypto] secp256k1.verifySignatureDERLowS', async (t) => { test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { const secp256k1 = await secp256k1Promise; const equivalentToSecp256k1Node = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -1132,7 +1349,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { ); const equivalentToElliptic = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), fc.boolean(), @@ -1144,7 +1361,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { return ( ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureDERLowS( - secp256k1.normalizeSignatureDER(testSig), + secp256k1.normalizeSignatureDER(testSig) as Uint8Array, pub, message ) @@ -1158,26 +1375,35 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { }); }); -test('[crypto] secp256k1.signMessageHashSchnorr', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.signMessageHashSchnorr', (t) => { t.deepEqual( - secp256k1.signMessageHashSchnorr(privkey, schnorrMsgHash), + internalSecp256k1.signMessageHashSchnorr(privkey, schnorrMsgHash), + sigSchnorr + ); + t.notDeepEqual( + internalSecp256k1.signMessageHashSchnorr(Uint8Array.of(), schnorrMsgHash), sigSchnorr ); - t.throws(() => - secp256k1.signMessageHashSchnorr(secp256k1OrderN, schnorrMsgHash) + t.deepEqual( + internalSecp256k1.signMessageHashSchnorr(secp256k1OrderN, schnorrMsgHash), + Secp256k1Error.signWithInvalidPrivateKey ); }); test('[fast-check] [crypto] secp256k1.signMessageHashSchnorr', async (t) => { const secp256k1 = await secp256k1Promise; const createsValidSignatures = fc.property( - fcValidPrivateKey(secp256k1), + fcValidPrivateKey, fcUint8Array32(), fc.boolean(), (privateKey, hash, invalidate) => { - const publicKey = secp256k1.derivePublicKeyCompressed(privateKey); - const signature = secp256k1.signMessageHashSchnorr(privateKey, hash); + const publicKey = secp256k1.derivePublicKeyCompressed( + privateKey + ) as Uint8Array; + const signature = secp256k1.signMessageHashSchnorr( + privateKey, + hash + ) as Uint8Array; t.is( secp256k1.verifySignatureSchnorr( invalidate ? signature : signature.fill(0), @@ -1193,18 +1419,24 @@ test('[fast-check] [crypto] secp256k1.signMessageHashSchnorr', async (t) => { }); }); -test('[crypto] secp256k1.verifySchnorr', async (t) => { - const secp256k1 = await secp256k1Promise; +test('[crypto] secp256k1.verifySignatureSchnorr', (t) => { t.true( - secp256k1.verifySignatureSchnorr( + internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyCompressed, schnorrMsgHash ) ); + t.false( + internalSecp256k1.verifySignatureSchnorr( + Uint8Array.of(), + pubkeyCompressed, + schnorrMsgHash + ) + ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( - secp256k1.verifySignatureSchnorr( + internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyWithBrokenEncoding, schnorrMsgHash @@ -1212,7 +1444,7 @@ test('[crypto] secp256k1.verifySchnorr', async (t) => { ); const sigSchnorrWithBadSignature = sigSchnorr.slice().fill(0, 6, 7); t.false( - secp256k1.verifySignatureSchnorr( + internalSecp256k1.verifySignatureSchnorr( sigSchnorrWithBadSignature, pubkeyCompressed, schnorrMsgHash @@ -1228,7 +1460,7 @@ test('[crypto] secp256k1.verifySchnorr', async (t) => { const msg1 = Uint8Array.from([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]); // prettier-ignore const sig1 = Uint8Array.from([0x78, 0x7a, 0x84, 0x8e, 0x71, 0x04, 0x3d, 0x28, 0x0c, 0x50, 0x47, 0x0e, 0x8e, 0x15, 0x32, 0xb2, 0xdd, 0x5d, 0x20, 0xee, 0x91, 0x2a, 0x45, 0xdb, 0xdd, 0x2b, 0xd1, 0xdf, 0xbf, 0x18, 0x7e, 0xf6, 0x70, 0x31, 0xa9, 0x88, 0x31, 0x85, 0x9d, 0xc3, 0x4d, 0xff, 0xee, 0xdd, 0xa8, 0x68, 0x31, 0x84, 0x2c, 0xcd, 0x00, 0x79, 0xe1, 0xf9, 0x2a, 0xf1, 0x77, 0xf7, 0xf2, 0x2c, 0xc1, 0xdc, 0xed, 0x05]); - t.is(secp256k1.verifySignatureSchnorr(sig1, pk1, msg1), true); + t.is(internalSecp256k1.verifySignatureSchnorr(sig1, pk1, msg1), true); /* Test vector 2 */ // prettier-ignore @@ -1237,7 +1469,7 @@ test('[crypto] secp256k1.verifySchnorr', async (t) => { const msg2 = Uint8Array.from([0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89]); // prettier-ignore const sig2 = Uint8Array.from([0x2a, 0x29, 0x8d, 0xac, 0xae, 0x57, 0x39, 0x5a, 0x15, 0xd0, 0x79, 0x5d, 0xdb, 0xfd, 0x1d, 0xcb, 0x56, 0x4d, 0xa8, 0x2b, 0x0f, 0x26, 0x9b, 0xc7, 0x0a, 0x74, 0xf8, 0x22, 0x04, 0x29, 0xba, 0x1d, 0x1e, 0x51, 0xa2, 0x2c, 0xce, 0xc3, 0x55, 0x99, 0xb8, 0xf2, 0x66, 0x91, 0x22, 0x81, 0xf8, 0x36, 0x5f, 0xfc, 0x2d, 0x03, 0x5a, 0x23, 0x04, 0x34, 0xa1, 0xa6, 0x4d, 0xc5, 0x9f, 0x70, 0x13, 0xfd]); - t.is(secp256k1.verifySignatureSchnorr(sig2, pk2, msg2), true); + t.is(internalSecp256k1.verifySignatureSchnorr(sig2, pk2, msg2), true); /* Test vector 6: R.y is not a quadratic residue */ // prettier-ignore @@ -1246,5 +1478,5 @@ test('[crypto] secp256k1.verifySchnorr', async (t) => { const msg6 = Uint8Array.from([0x24, 0x3f, 0x6a, 0x88, 0x85, 0xa3, 0x08, 0xd3, 0x13, 0x19, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x44, 0xa4, 0x09, 0x38, 0x22, 0x29, 0x9f, 0x31, 0xd0, 0x08, 0x2e, 0xfa, 0x98, 0xec, 0x4e, 0x6c, 0x89]); // prettier-ignore const sig6 = Uint8Array.from([0x2a, 0x29, 0x8d, 0xac, 0xae, 0x57, 0x39, 0x5a, 0x15, 0xd0, 0x79, 0x5d, 0xdb, 0xfd, 0x1d, 0xcb, 0x56, 0x4d, 0xa8, 0x2b, 0x0f, 0x26, 0x9b, 0xc7, 0x0a, 0x74, 0xf8, 0x22, 0x04, 0x29, 0xba, 0x1d, 0xfa, 0x16, 0xae, 0xe0, 0x66, 0x09, 0x28, 0x0a, 0x19, 0xb6, 0x7a, 0x24, 0xe1, 0x97, 0x7e, 0x46, 0x97, 0x71, 0x2b, 0x5f, 0xd2, 0x94, 0x39, 0x14, 0xec, 0xd5, 0xf7, 0x30, 0x90, 0x1b, 0x4a, 0xb7]); - t.is(secp256k1.verifySignatureSchnorr(sig6, pk6, msg6), false); + t.is(internalSecp256k1.verifySignatureSchnorr(sig6, pk6, msg6), false); }); diff --git a/src/lib/crypto/secp256k1.ts b/src/lib/crypto/secp256k1.ts index f194913a..a248f624 100644 --- a/src/lib/crypto/secp256k1.ts +++ b/src/lib/crypto/secp256k1.ts @@ -1,16 +1,14 @@ -/* eslint-disable functional/no-conditional-statement, functional/no-expression-statement, functional/no-throw-statement */ +/* eslint-disable functional/no-conditional-statement, functional/no-expression-statement, functional/no-return-void */ +import type { RecoveryId, Secp256k1, Secp256k1Wasm } from '../lib'; + import { CompressionFlag, ContextFlag, instantiateSecp256k1Wasm, instantiateSecp256k1WasmBytes, - Secp256k1Wasm, -} from '../bin/bin'; - -import { RecoverableSignature, RecoveryId, Secp256k1 } from './secp256k1-types'; - -export { RecoverableSignature, RecoveryId, Secp256k1 }; +} from './dependencies.js'; +/* eslint-disable @typescript-eslint/no-duplicate-enum-values */ const enum ByteLength { compactSig = 64, compressedPublicKey = 33, @@ -25,6 +23,20 @@ const enum ByteLength { schnorrSig = 64, uncompressedPublicKey = 65, } +/* eslint-enable @typescript-eslint/no-duplicate-enum-values */ + +export enum Secp256k1Error { + unparsableSignature = 'Failed to parse signature.', + unparsablePublicKey = 'Failed to parse public key.', + derivePublicKeyFromInvalidPrivateKey = 'Cannot derive public key from invalid private key.', + signWithInvalidPrivateKey = 'Failed to sign message hash. The private key is not valid.', + recoverPublicKeyWithUnparsableSignature = 'Failed to recover public key. Could not parse signature.', + recoverPublicKeyInvalidMaterial = 'Failed to recover public key. The compact signature, recovery, or message hash is invalid.', + addTweakPrivateKey = 'Private key is invalid or adding failed.', + mulTweakPrivateKey = 'Private key is invalid or multiplying failed.', + addTweakPublicKey = 'Failed to tweak public key (by addition).', + mulTweakPublicKey = 'Failed to tweak public key (by multiplication).', +} /** * @param secp256k1Wasm - a Secp256k1Wasm object @@ -76,8 +88,15 @@ const wrapSecp256k1Wasm = ( // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const lengthPtrView32 = lengthPtr >> 2; + const cloneAndPad = (value: Uint8Array, expectedLength: number) => { + const zeroPaddedValue = new Uint8Array(expectedLength); + zeroPaddedValue.set(value); + return zeroPaddedValue; + }; + const parsePublicKey = (publicKey: Uint8Array) => { - secp256k1Wasm.heapU8.set(publicKey, publicKeyScratch); + const paddedPublicKey = cloneAndPad(publicKey, ByteLength.maxPublicKey); + secp256k1Wasm.heapU8.set(paddedPublicKey, publicKeyScratch); return ( secp256k1Wasm.pubkeyParse( contextPtr, @@ -93,7 +112,8 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.heapU32.set([value], lengthPtrView32); }; - const getLengthPtr = () => secp256k1Wasm.heapU32[lengthPtrView32]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const getLengthPtr = () => secp256k1Wasm.heapU32[lengthPtrView32]!; const serializePublicKey = (length: number, flag: number) => { setLengthPtr(length); @@ -118,17 +138,16 @@ const wrapSecp256k1Wasm = ( CompressionFlag.UNCOMPRESSED ); - const convertPublicKey = ( - compressed: boolean - ): ((publicKey: Uint8Array) => Uint8Array) => (publicKey) => { + const convertPublicKey = (compressed: boolean) => (publicKey: Uint8Array) => { if (!parsePublicKey(publicKey)) { - throw new Error('Failed to parse public key.'); + return Secp256k1Error.unparsablePublicKey; } return getSerializedPublicKey(compressed); }; const parseSignature = (signature: Uint8Array, isDer: boolean) => { - secp256k1Wasm.heapU8.set(signature, sigScratch); + const paddedSignature = cloneAndPad(signature, ByteLength.maxECDSASig); + secp256k1Wasm.heapU8.set(paddedSignature, sigScratch); return isDer ? secp256k1Wasm.signatureParseDER( contextPtr, @@ -143,12 +162,6 @@ const wrapSecp256k1Wasm = ( ) === 1; }; - const parseOrThrow = (signature: Uint8Array, isDer: boolean) => { - if (!parseSignature(signature, isDer)) { - throw new Error('Failed to parse signature.'); - } - }; - const getCompactSig = () => { secp256k1Wasm.signatureSerializeCompact( contextPtr, @@ -169,15 +182,16 @@ const wrapSecp256k1Wasm = ( return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); }; - const convertSignature = ( - wasDER: boolean - ): ((signature: Uint8Array) => Uint8Array) => (signature) => { - parseOrThrow(signature, wasDER); + const convertSignature = (wasDER: boolean) => (signature: Uint8Array) => { + if (!parseSignature(signature, wasDER)) { + return Secp256k1Error.unparsableSignature; + } return wasDER ? getCompactSig() : getDERSig(); }; const fillPrivateKeyPtr = (privateKey: Uint8Array) => { - secp256k1Wasm.heapU8.set(privateKey, privateKeyPtr); + const paddedPrivateKey = cloneAndPad(privateKey, ByteLength.privateKey); + secp256k1Wasm.heapU8.set(paddedPrivateKey, privateKeyPtr); }; const zeroOutPtr = (pointer: number, bytes: number) => { @@ -198,9 +212,7 @@ const wrapSecp256k1Wasm = ( return ret; }; - const derivePublicKey = ( - compressed: boolean - ): ((privateKey: Uint8Array) => Uint8Array) => (privateKey) => { + const derivePublicKey = (compressed: boolean) => (privateKey: Uint8Array) => { const invalid = withPrivateKey( privateKey, () => @@ -212,14 +224,15 @@ const wrapSecp256k1Wasm = ( ); if (invalid) { - throw new Error('Cannot derive public key from invalid private key.'); + return Secp256k1Error.derivePublicKeyFromInvalidPrivateKey; } return getSerializedPublicKey(compressed); }; const fillMessageHashScratch = (messageHash: Uint8Array) => { - secp256k1Wasm.heapU8.set(messageHash, messageHashScratch); + const paddedMessageHash = cloneAndPad(messageHash, ByteLength.messageHash); + secp256k1Wasm.heapU8.set(paddedMessageHash, messageHashScratch); }; const normalizeSignature = () => { @@ -230,22 +243,22 @@ const wrapSecp256k1Wasm = ( ); }; - const modifySignature = ( - isDer: boolean, - normalize: boolean - ): ((signature: Uint8Array) => Uint8Array) => (signature) => { - parseOrThrow(signature, isDer); - if (normalize) { - normalizeSignature(); - } else { - secp256k1Wasm.signatureMalleate( - contextPtr, - internalSigPtr, - internalSigPtr - ); - } - return isDer ? getDERSig() : getCompactSig(); - }; + const modifySignature = + (isDer: boolean, normalize: boolean) => (signature: Uint8Array) => { + if (!parseSignature(signature, isDer)) { + return Secp256k1Error.unparsableSignature; + } + if (normalize) { + normalizeSignature(); + } else { + secp256k1Wasm.signatureMalleate( + contextPtr, + internalSigPtr, + internalSigPtr + ); + } + return isDer ? getDERSig() : getCompactSig(); + }; const parseAndNormalizeSignature = ( signature: Uint8Array, @@ -259,72 +272,64 @@ const wrapSecp256k1Wasm = ( return ret; }; - const signMessageHash = (isDer: boolean) => ( - privateKey: Uint8Array, - messageHash: Uint8Array - ) => { - fillMessageHashScratch(messageHash); - return withPrivateKey(privateKey, () => { - const failed = - secp256k1Wasm.sign( - contextPtr, - internalSigPtr, - messageHashScratch, - privateKeyPtr - ) !== 1; - - if (failed) { - throw new Error( - 'Failed to sign message hash. The private key is not valid.' - ); - } - - if (isDer) { - setLengthPtr(ByteLength.maxECDSASig); - secp256k1Wasm.signatureSerializeDER( + const signMessageHash = + (isDer: boolean) => (privateKey: Uint8Array, messageHash: Uint8Array) => { + fillMessageHashScratch(messageHash); + return withPrivateKey(privateKey, () => { + const failed = + secp256k1Wasm.sign( + contextPtr, + internalSigPtr, + messageHashScratch, + privateKeyPtr + ) !== 1; + + if (failed) { + return Secp256k1Error.signWithInvalidPrivateKey; + } + + if (isDer) { + setLengthPtr(ByteLength.maxECDSASig); + secp256k1Wasm.signatureSerializeDER( + contextPtr, + sigScratch, + lengthPtr, + internalSigPtr + ); + return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); + } + secp256k1Wasm.signatureSerializeCompact( contextPtr, sigScratch, - lengthPtr, internalSigPtr ); - return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); - } - secp256k1Wasm.signatureSerializeCompact( - contextPtr, - sigScratch, - internalSigPtr - ); - return secp256k1Wasm - .readHeapU8(sigScratch, ByteLength.compactSig) - .slice(); - }); - }; - - const signMessageHashSchnorr = () => ( - privateKey: Uint8Array, - messageHash: Uint8Array - ) => { - fillMessageHashScratch(messageHash); - return withPrivateKey(privateKey, () => { - const failed = - secp256k1Wasm.schnorrSign( - contextPtr, - schnorrSigPtr, - messageHashScratch, - privateKeyPtr - ) !== 1; - - if (failed) { - throw new Error( - 'Failed to sign message hash. The private key is not valid.' - ); - } - - return secp256k1Wasm - .readHeapU8(schnorrSigPtr, ByteLength.schnorrSig) - .slice(); - }); - }; + return secp256k1Wasm + .readHeapU8(sigScratch, ByteLength.compactSig) + .slice(); + }); + }; + + const signMessageHashSchnorr = + () => (privateKey: Uint8Array, messageHash: Uint8Array) => { + fillMessageHashScratch(messageHash); + return withPrivateKey(privateKey, () => { + const failed = + secp256k1Wasm.schnorrSign( + contextPtr, + schnorrSigPtr, + messageHashScratch, + privateKeyPtr + ) !== 1; + + if (failed) { + return Secp256k1Error.signWithInvalidPrivateKey; + } + + return secp256k1Wasm + .readHeapU8(schnorrSigPtr, ByteLength.schnorrSig) + .slice(); + }); + }; const verifyMessage = (messageHash: Uint8Array) => { fillMessageHashScratch(messageHash); @@ -338,21 +343,20 @@ const wrapSecp256k1Wasm = ( ); }; - const verifySignature = (isDer: boolean, normalize: boolean) => ( - signature: Uint8Array, - publicKey: Uint8Array, - messageHash: Uint8Array - ) => - parsePublicKey(publicKey) && - parseAndNormalizeSignature(signature, isDer, normalize) && - verifyMessage(messageHash); + const verifySignature = + (isDer: boolean, normalize: boolean) => + (signature: Uint8Array, publicKey: Uint8Array, messageHash: Uint8Array) => + parsePublicKey(publicKey) && + parseAndNormalizeSignature(signature, isDer, normalize) && + verifyMessage(messageHash); const verifyMessageSchnorr = ( messageHash: Uint8Array, signature: Uint8Array ) => { fillMessageHashScratch(messageHash); - secp256k1Wasm.heapU8.set(signature, schnorrSigPtr); + const paddedSignature = cloneAndPad(signature, ByteLength.schnorrSig); + secp256k1Wasm.heapU8.set(paddedSignature, schnorrSigPtr); return ( secp256k1Wasm.schnorrVerify( contextPtr, @@ -363,21 +367,19 @@ const wrapSecp256k1Wasm = ( ); }; - const verifySignatureSchnorr = () => ( - signature: Uint8Array, - publicKey: Uint8Array, - messageHash: Uint8Array - ) => - parsePublicKey(publicKey) - ? verifyMessageSchnorr(messageHash, signature) - : false; + const verifySignatureSchnorr = + () => + (signature: Uint8Array, publicKey: Uint8Array, messageHash: Uint8Array) => + parsePublicKey(publicKey) + ? verifyMessageSchnorr(messageHash, signature) + : false; const signMessageHashRecoverable = ( privateKey: Uint8Array, messageHash: Uint8Array - ): RecoverableSignature => { + ) => { fillMessageHashScratch(messageHash); - return withPrivateKey(privateKey, () => { + return withPrivateKey(privateKey, () => { if ( secp256k1Wasm.signRecoverable( contextPtr, @@ -386,9 +388,7 @@ const wrapSecp256k1Wasm = ( privateKeyPtr ) !== 1 ) { - throw new Error( - 'Failed to sign message hash. The private key is not valid.' - ); + return Secp256k1Error.signWithInvalidPrivateKey; } secp256k1Wasm.recoverableSignatureSerialize( contextPtr, @@ -406,46 +406,45 @@ const wrapSecp256k1Wasm = ( }); }; - const recoverPublicKey = (compressed: boolean) => ( - signature: Uint8Array, - recoveryId: RecoveryId, - messageHash: Uint8Array - ) => { - fillMessageHashScratch(messageHash); - secp256k1Wasm.heapU8.set(signature, sigScratch); - if ( - secp256k1Wasm.recoverableSignatureParse( - contextPtr, - internalRSigPtr, - sigScratch, - recoveryId - ) !== 1 - ) { - throw new Error( - 'Failed to recover public key. Could not parse signature.' - ); - } - if ( - secp256k1Wasm.recover( - contextPtr, - internalPublicKeyPtr, - internalRSigPtr, - messageHashScratch - ) !== 1 - ) { - throw new Error( - 'Failed to recover public key. The compact signature, recovery, or message hash is invalid.' - ); - } - return getSerializedPublicKey(compressed); - }; + const recoverPublicKey = + (compressed: boolean) => + ( + signature: Uint8Array, + recoveryId: RecoveryId, + messageHash: Uint8Array + ) => { + fillMessageHashScratch(messageHash); + const paddedSignature = cloneAndPad(signature, ByteLength.maxECDSASig); + secp256k1Wasm.heapU8.set(paddedSignature, sigScratch); + if ( + secp256k1Wasm.recoverableSignatureParse( + contextPtr, + internalRSigPtr, + sigScratch, + recoveryId + ) !== 1 + ) { + return Secp256k1Error.recoverPublicKeyWithUnparsableSignature; + } + if ( + secp256k1Wasm.recover( + contextPtr, + internalPublicKeyPtr, + internalRSigPtr, + messageHashScratch + ) !== 1 + ) { + return Secp256k1Error.recoverPublicKeyInvalidMaterial; + } + return getSerializedPublicKey(compressed); + }; const addTweakPrivateKey = ( privateKey: Uint8Array, tweakValue: Uint8Array - ): Uint8Array => { + ) => { fillMessageHashScratch(tweakValue); - return withPrivateKey(privateKey, () => { + return withPrivateKey(privateKey, () => { if ( secp256k1Wasm.privkeyTweakAdd( contextPtr, @@ -453,7 +452,7 @@ const wrapSecp256k1Wasm = ( messageHashScratch ) !== 1 ) { - throw new Error('Private key is invalid or adding failed.'); + return Secp256k1Error.addTweakPrivateKey; } return secp256k1Wasm .readHeapU8(privateKeyPtr, ByteLength.privateKey) @@ -464,9 +463,9 @@ const wrapSecp256k1Wasm = ( const mulTweakPrivateKey = ( privateKey: Uint8Array, tweakValue: Uint8Array - ): Uint8Array => { + ) => { fillMessageHashScratch(tweakValue); - return withPrivateKey(privateKey, () => { + return withPrivateKey(privateKey, () => { if ( secp256k1Wasm.privkeyTweakMul( contextPtr, @@ -474,7 +473,7 @@ const wrapSecp256k1Wasm = ( messageHashScratch ) !== 1 ) { - throw new Error('Private key is invalid or multiplying failed.'); + return Secp256k1Error.mulTweakPrivateKey; } return secp256k1Wasm .readHeapU8(privateKeyPtr, ByteLength.privateKey) @@ -482,67 +481,48 @@ const wrapSecp256k1Wasm = ( }); }; - const addTweakPublicKey = (compressed: boolean) => ( - publicKey: Uint8Array, - tweakValue: Uint8Array - ) => { - if (!parsePublicKey(publicKey)) { - throw new Error('Failed to parse public key.'); - } - fillMessageHashScratch(tweakValue); - if ( - secp256k1Wasm.pubkeyTweakAdd( - contextPtr, - internalPublicKeyPtr, - messageHashScratch - ) !== 1 - ) { - throw new Error('Adding failed'); - } - return getSerializedPublicKey(compressed); - }; - - const mulTweakPublicKey = (compressed: boolean) => ( - publicKey: Uint8Array, - tweakValue: Uint8Array - ) => { - if (!parsePublicKey(publicKey)) { - throw new Error('Failed to parse public key.'); - } - fillMessageHashScratch(tweakValue); - if ( - secp256k1Wasm.pubkeyTweakMul( - contextPtr, - internalPublicKeyPtr, - messageHashScratch - ) !== 1 - ) { - throw new Error('Multiplying failed'); - } - return getSerializedPublicKey(compressed); - }; + const addTweakPublicKey = + (compressed: boolean) => + (publicKey: Uint8Array, tweakValue: Uint8Array) => { + if (!parsePublicKey(publicKey)) { + return Secp256k1Error.unparsablePublicKey; + } + fillMessageHashScratch(tweakValue); + if ( + secp256k1Wasm.pubkeyTweakAdd( + contextPtr, + internalPublicKeyPtr, + messageHashScratch + ) !== 1 + ) { + return Secp256k1Error.addTweakPublicKey; + } + return getSerializedPublicKey(compressed); + }; + + const mulTweakPublicKey = + (compressed: boolean) => + (publicKey: Uint8Array, tweakValue: Uint8Array) => { + if (!parsePublicKey(publicKey)) { + return Secp256k1Error.unparsablePublicKey; + } + fillMessageHashScratch(tweakValue); + if ( + secp256k1Wasm.pubkeyTweakMul( + contextPtr, + internalPublicKeyPtr, + messageHashScratch + ) !== 1 + ) { + return Secp256k1Error.mulTweakPublicKey; + } + return getSerializedPublicKey(compressed); + }; - /** - * The value of this precaution is debatable, especially in the context of - * javascript and WebAssembly. - * - * In the secp256k1 C library, context randomization is an additional layer of - * security from side-channel attacks which attempt to extract private key - * information by analyzing things like a CPU's emitted radio frequencies or - * power usage. - * - * In this library, these attacks seem even less likely, since the "platform" - * on which this code will be executed (e.g. V8) is likely to obscure any - * such signals. - * - * Still, out of an abundance of caution (and because no one has produced a - * definitive proof indicating that this is not helpful), this library exposes - * the ability to randomize the context like the C library. Depending on the - * intended application, consumers can decide whether or not to randomize. - */ if (randomSeed !== undefined) { const randomSeedPtr = messageHashScratch; - secp256k1Wasm.heapU8.set(randomSeed, randomSeedPtr); + const paddedRandomSeed = cloneAndPad(randomSeed, ByteLength.randomSeed); + secp256k1Wasm.heapU8.set(paddedRandomSeed, randomSeedPtr); secp256k1Wasm.contextRandomize(contextPtr, randomSeedPtr); zeroOutPtr(randomSeedPtr, ByteLength.randomSeed); } @@ -585,35 +565,28 @@ const wrapSecp256k1Wasm = ( }; /** - * This method is like `instantiateSecp256k1`, but requires the consumer to - * `Window.fetch` or `fs.readFile` the `secp256k1.wasm` binary and provide it to - * this method as `webassemblyBytes`. This skips a base64 decoding of an + * This method is like {@link instantiateSecp256k1}, but requires the consumer + * to `Window.fetch` or `fs.readFile` the `secp256k1.wasm` binary and provide it + * to this method as `webassemblyBytes`. This skips a base64 decoding of an * embedded binary. * * ### Randomizing the Context with `randomSeed` * This method also accepts an optional, 32-byte `randomSeed`, which is passed * to the `contextRandomize` method in the underlying WebAssembly. * - * The value of this precaution is debatable, especially in the context of - * javascript and WebAssembly. - * * In the secp256k1 C library, context randomization is an additional layer of - * security from side-channel attacks which attempt to extract private key + * security from side-channel attacks that attempt to extract private key * information by analyzing things like a CPU's emitted radio frequencies or * power usage. * - * In this library, these attacks seem even less likely, since the "platform" - * on which this code will be executed (e.g. V8) is likely to obscure any - * such signals. - * - * Still, out of an abundance of caution (and because no one has produced a - * definitive proof indicating that this is not helpful), this library exposes - * the ability to randomize the context like the C library. Depending on the - * intended application, consumers can decide whether or not to randomize. + * As most applications also benefit from deterministic, reproducible behavior, + * context is not randomized by default in Libauth. To randomize the context, + * provide a 32-byte Uint8Array of cryptographically strong random values + * (e.g. `Crypto.getRandomValues()`). * * @param webassemblyBytes - an ArrayBuffer containing the bytes from Libauth's * `secp256k1.wasm` binary. Providing this buffer manually may be faster than - * the internal base64 decode which happens in `instantiateSecp256k1`. + * the internal base64 decode that happens in {@link instantiateSecp256k1}. * @param randomSeed - a 32-byte random seed used to randomize the secp256k1 * context after creation. See above for details. */ @@ -626,27 +599,16 @@ export const instantiateSecp256k1Bytes = async ( randomSeed ); -const cachedSecp256k1: { cache?: Promise } = {}; - /** * Create and wrap a Secp256k1 WebAssembly instance to expose a set of * purely-functional Secp256k1 methods. For slightly faster initialization, use - * `instantiateSecp256k1Bytes`. + * {@link instantiateSecp256k1Bytes}. * * @param randomSeed - a 32-byte random seed used to randomize the secp256k1 - * context after creation. See the description in `instantiateSecp256k1Bytes` - * for details. + * context after creation. See the description in + * {@link instantiateSecp256k1Bytes} for details. */ export const instantiateSecp256k1 = async ( randomSeed?: Uint8Array -): Promise => { - if (cachedSecp256k1.cache !== undefined) { - return cachedSecp256k1.cache; - } - const result = Promise.resolve( - wrapSecp256k1Wasm(await instantiateSecp256k1Wasm(), randomSeed) - ); - // eslint-disable-next-line require-atomic-updates, functional/immutable-data - cachedSecp256k1.cache = result; - return result; -}; +): Promise => + wrapSecp256k1Wasm(await instantiateSecp256k1Wasm(), randomSeed); diff --git a/src/lib/crypto/sha1.bench.ts b/src/lib/crypto/sha1.bench.ts index 148d9f46..e0ff2ddf 100644 --- a/src/lib/crypto/sha1.bench.ts +++ b/src/lib/crypto/sha1.bench.ts @@ -1,6 +1,6 @@ -import { instantiateSha1, Sha1 } from '../lib'; +import type { Sha1 } from '../lib'; +import { instantiateSha1 } from '../lib.js'; -import { benchmarkHashingFunction } from './hash.bench.helper'; +import { benchmarkHashingFunction } from './hash.bench.helper.js'; -// eslint-disable-next-line functional/no-expression-statement benchmarkHashingFunction('sha1', instantiateSha1(), 'sha1'); diff --git a/src/lib/crypto/sha1.spec.ts b/src/lib/crypto/sha1.spec.ts index 78fe11be..50fe6023 100644 --- a/src/lib/crypto/sha1.spec.ts +++ b/src/lib/crypto/sha1.spec.ts @@ -1,12 +1,11 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ +import type { Sha1 } from '../lib'; import { getEmbeddedSha1Binary, instantiateSha1, instantiateSha1Bytes, - Sha1, -} from '../lib'; +} from '../lib.js'; -import { testHashFunction } from './hash.spec.helper'; +import { testHashFunction } from './hash.spec.helper.js'; // prettier-ignore const abcHash = new Uint8Array([169, 153, 62, 54, 71, 6, 129, 106, 186, 62, 37, 113, 120, 80, 194, 108, 156, 208, 216, 157]); @@ -15,15 +14,15 @@ const abcHash = new Uint8Array([169, 153, 62, 54, 71, 6, 129, 106, 186, 62, 37, const testHash = new Uint8Array([169, 74, 143, 229, 204, 177, 155, 166, 28, 76, 8, 115, 211, 145, 233, 135, 152, 47, 187, 211]); // prettier-ignore -const bitcoinTsHash = new Uint8Array([172, 243, 119, 55, 165, 187, 137, 56, 129, 102, 231, 172, 37, 23, 43, 80, 241, 124, 241, 186]); +const libauthHash = new Uint8Array([0, 53, 165, 162, 96, 82, 50, 137, 170, 76, 156, 212, 51, 123, 185, 71, 205, 18, 93, 14]); testHashFunction({ abcHash, - bitcoinTsHash, getEmbeddedBinary: getEmbeddedSha1Binary, hashFunctionName: 'sha1', instantiate: instantiateSha1, instantiateBytes: instantiateSha1Bytes, + libauthHash, nodeJsAlgorithm: 'sha1', testHash, }); diff --git a/src/lib/crypto/sha1.ts b/src/lib/crypto/sha1.ts index f92c8fb4..36da72e2 100644 --- a/src/lib/crypto/sha1.ts +++ b/src/lib/crypto/sha1.ts @@ -1,5 +1,10 @@ -import { HashFunction, instantiateRustWasm, sha1Base64Bytes } from '../bin/bin'; -import { base64ToBin } from '../format/format'; +import type { HashFunction } from '../lib'; + +import { + base64ToBin, + instantiateRustWasm, + sha1Base64Bytes, +} from './dependencies.js'; export interface Sha1 extends HashFunction { /** @@ -40,7 +45,7 @@ export interface Sha1 extends HashFunction { /** * Add input to an incremental sha1 hashing computation. * - * Returns a raw state which can again be passed to `update` with additional + * Returns a raw state that can again be passed to `update` with additional * input to continue the computation. * * When the computation has been updated with all input, pass the raw state to @@ -54,7 +59,7 @@ export interface Sha1 extends HashFunction { /** * The most performant way to instantiate sha1 functionality. To avoid - * using Node.js or DOM-specific APIs, you can use `instantiateSha1`. + * using Node.js or DOM-specific APIs, you can use {@link instantiateSha1}. * * @param webassemblyBytes - A buffer containing the sha1 binary. */ @@ -80,18 +85,9 @@ export const instantiateSha1Bytes = async ( export const getEmbeddedSha1Binary = (): ArrayBuffer => base64ToBin(sha1Base64Bytes).buffer; -const cachedSha1: { cache?: Promise } = {}; - /** - * An ultimately-portable (but slower) version of `instantiateSha1Bytes` - * which does not require the consumer to provide the sha1 binary buffer. + * An ultimately-portable (but slower) version of {@link instantiateSha1Bytes} + * that does not require the consumer to provide the sha1 binary buffer. */ -export const instantiateSha1 = async (): Promise => { - if (cachedSha1.cache !== undefined) { - return cachedSha1.cache; - } - const result = instantiateSha1Bytes(getEmbeddedSha1Binary()); - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement - cachedSha1.cache = result; - return result; -}; +export const instantiateSha1 = async (): Promise => + instantiateSha1Bytes(getEmbeddedSha1Binary()); diff --git a/src/lib/crypto/sha256.bench.ts b/src/lib/crypto/sha256.bench.ts index 2f3c2897..cf4034d3 100644 --- a/src/lib/crypto/sha256.bench.ts +++ b/src/lib/crypto/sha256.bench.ts @@ -1,6 +1,6 @@ -import { instantiateSha256, Sha256 } from '../lib'; +import type { Sha256 } from '../lib'; +import { instantiateSha256 } from '../lib.js'; -import { benchmarkHashingFunction } from './hash.bench.helper'; +import { benchmarkHashingFunction } from './hash.bench.helper.js'; -// eslint-disable-next-line functional/no-expression-statement benchmarkHashingFunction('sha256', instantiateSha256(), 'sha256'); diff --git a/src/lib/crypto/sha256.spec.ts b/src/lib/crypto/sha256.spec.ts index 719ff492..6358b256 100644 --- a/src/lib/crypto/sha256.spec.ts +++ b/src/lib/crypto/sha256.spec.ts @@ -1,12 +1,11 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ +import type { Sha256 } from '../lib'; import { getEmbeddedSha256Binary, instantiateSha256, instantiateSha256Bytes, - Sha256, -} from '../lib'; +} from '../lib.js'; -import { testHashFunction } from './hash.spec.helper'; +import { testHashFunction } from './hash.spec.helper.js'; // prettier-ignore const abcHash = new Uint8Array([186, 120, 22, 191, 143, 1, 207, 234, 65, 65, 64, 222, 93, 174, 34, 35, 176, 3, 97, 163, 150, 23, 122, 156, 180, 16, 255, 97, 242, 0, 21, 173]); @@ -15,15 +14,15 @@ const abcHash = new Uint8Array([186, 120, 22, 191, 143, 1, 207, 234, 65, 65, 64, const testHash = new Uint8Array([159, 134, 208, 129, 136, 76, 125, 101, 154, 47, 234, 160, 197, 90, 208, 21, 163, 191, 79, 27, 43, 11, 130, 44, 209, 93, 108, 21, 176, 240, 10, 8]); // prettier-ignore -const bitcoinTsHash = new Uint8Array([197, 172, 209, 87, 32, 54, 111, 116, 79, 74, 33, 12, 216, 172, 180, 55, 181, 8, 52, 10, 69, 75, 79, 77, 6, 145, 161, 201, 161, 182, 67, 158]); +const libauthHash = new Uint8Array([209, 125, 16, 114, 40, 162, 151, 83, 58, 228, 34, 240, 156, 140, 231, 64, 126, 178, 1, 161, 142, 172, 134, 169, 6, 119, 134, 200, 184, 30, 187, 120]); testHashFunction({ abcHash, - bitcoinTsHash, getEmbeddedBinary: getEmbeddedSha256Binary, hashFunctionName: 'sha256', instantiate: instantiateSha256, instantiateBytes: instantiateSha256Bytes, + libauthHash, nodeJsAlgorithm: 'sha256', testHash, }); diff --git a/src/lib/crypto/sha256.ts b/src/lib/crypto/sha256.ts index 122a0785..306be536 100644 --- a/src/lib/crypto/sha256.ts +++ b/src/lib/crypto/sha256.ts @@ -1,9 +1,10 @@ +import type { HashFunction } from '../lib'; + import { - HashFunction, + base64ToBin, instantiateRustWasm, sha256Base64Bytes, -} from '../bin/bin'; -import { base64ToBin } from '../format/format'; +} from './dependencies.js'; export interface Sha256 extends HashFunction { /** @@ -58,7 +59,7 @@ export interface Sha256 extends HashFunction { /** * The most performant way to instantiate sha256 functionality. To avoid - * using Node.js or DOM-specific APIs, you can use `instantiateSha256`. + * using Node.js or DOM-specific APIs, you can use {@link instantiateSha256}. * * @param webassemblyBytes - A buffer containing the sha256 binary. */ @@ -84,19 +85,10 @@ export const instantiateSha256Bytes = async ( export const getEmbeddedSha256Binary = () => base64ToBin(sha256Base64Bytes).buffer; -const cachedSha256: { cache?: Promise } = {}; - /** * An ultimately-portable (but possibly slower) version of - * `instantiateSha256Bytes` which does not require the consumer to provide the - * sha256 binary buffer. + * {@link instantiateSha256Bytes} which does not require the consumer to provide + * the sha256 binary buffer. */ -export const instantiateSha256 = async (): Promise => { - if (cachedSha256.cache !== undefined) { - return cachedSha256.cache; - } - const result = instantiateSha256Bytes(getEmbeddedSha256Binary()); - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement - cachedSha256.cache = result; - return result; -}; +export const instantiateSha256 = async (): Promise => + instantiateSha256Bytes(getEmbeddedSha256Binary()); diff --git a/src/lib/crypto/sha512.bench.ts b/src/lib/crypto/sha512.bench.ts index 446ffc41..8e3fa1f8 100644 --- a/src/lib/crypto/sha512.bench.ts +++ b/src/lib/crypto/sha512.bench.ts @@ -1,6 +1,6 @@ -import { instantiateSha512, Sha512 } from '../lib'; +import type { Sha512 } from '../lib'; +import { instantiateSha512 } from '../lib.js'; -import { benchmarkHashingFunction } from './hash.bench.helper'; +import { benchmarkHashingFunction } from './hash.bench.helper.js'; -// eslint-disable-next-line functional/no-expression-statement benchmarkHashingFunction('sha512', instantiateSha512(), 'sha512'); diff --git a/src/lib/crypto/sha512.spec.ts b/src/lib/crypto/sha512.spec.ts index 1fd4a6e2..9bf4133d 100644 --- a/src/lib/crypto/sha512.spec.ts +++ b/src/lib/crypto/sha512.spec.ts @@ -1,12 +1,11 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ +import type { Sha512 } from '../lib'; import { getEmbeddedSha512Binary, instantiateSha512, instantiateSha512Bytes, - Sha512, -} from '../lib'; +} from '../lib.js'; -import { testHashFunction } from './hash.spec.helper'; +import { testHashFunction } from './hash.spec.helper.js'; // prettier-ignore const abcHash = new Uint8Array([221, 175, 53, 161, 147, 97, 122, 186, 204, 65, 115, 73, 174, 32, 65, 49, 18, 230, 250, 78, 137, 169, 126, 162, 10, 158, 238, 230, 75, 85, 211, 154, 33, 146, 153, 42, 39, 79, 193, 168, 54, 186, 60, 35, 163, 254, 235, 189, 69, 77, 68, 35, 100, 60, 232, 14, 42, 154, 201, 79, 165, 76, 164, 159]); @@ -15,15 +14,15 @@ const abcHash = new Uint8Array([221, 175, 53, 161, 147, 97, 122, 186, 204, 65, 1 const testHash = new Uint8Array([238, 38, 176, 221, 74, 247, 231, 73, 170, 26, 142, 227, 193, 10, 233, 146, 63, 97, 137, 128, 119, 46, 71, 63, 136, 25, 165, 212, 148, 14, 13, 178, 122, 193, 133, 248, 160, 225, 213, 248, 79, 136, 188, 136, 127, 214, 123, 20, 55, 50, 195, 4, 204, 95, 169, 173, 142, 111, 87, 245, 0, 40, 168, 255]); // prettier-ignore -const bitcoinTsHash = new Uint8Array([199, 3, 62, 254, 211, 112, 236, 45, 153, 174, 172, 201, 56, 4, 81, 75, 63, 108, 8, 154, 220, 157, 74, 51, 3, 125, 152, 147, 138, 57, 239, 39, 144, 71, 255, 181, 173, 73, 150, 146, 149, 26, 151, 201, 54, 28, 80, 219, 128, 183, 24, 114, 55, 231, 4, 126, 200, 17, 11, 95, 50, 70, 85, 60]); +const libauthHash = new Uint8Array([27, 119, 76, 47, 15, 63, 203, 10, 157, 198, 236, 115, 55, 254, 4, 166, 127, 194, 140, 208, 81, 198, 141, 31, 81, 27, 240, 215, 32, 131, 13, 206, 240, 192, 196, 5, 189, 226, 121, 119, 173, 141, 227, 101, 2, 146, 59, 6, 120, 5, 24, 222, 22, 230, 116, 153, 116, 205, 56, 40, 138, 26, 29, 230]); testHashFunction({ abcHash, - bitcoinTsHash, getEmbeddedBinary: getEmbeddedSha512Binary, hashFunctionName: 'sha512', instantiate: instantiateSha512, instantiateBytes: instantiateSha512Bytes, + libauthHash, nodeJsAlgorithm: 'sha512', testHash, }); diff --git a/src/lib/crypto/sha512.ts b/src/lib/crypto/sha512.ts index d75b2aa4..95955ce7 100644 --- a/src/lib/crypto/sha512.ts +++ b/src/lib/crypto/sha512.ts @@ -1,9 +1,10 @@ +import type { HashFunction } from '../lib'; + import { - HashFunction, + base64ToBin, instantiateRustWasm, sha512Base64Bytes, -} from '../bin/bin'; -import { base64ToBin } from '../format/format'; +} from './dependencies.js'; export interface Sha512 extends HashFunction { /** @@ -44,7 +45,7 @@ export interface Sha512 extends HashFunction { /** * Add input to an incremental sha512 hashing computation. * - * Returns a raw state which can again be passed to `update` with additional + * Returns a raw state that can again be passed to `update` with additional * input to continue the computation. * * When the computation has been updated with all input, pass the raw state to @@ -58,7 +59,7 @@ export interface Sha512 extends HashFunction { /** * The most performant way to instantiate sha512 functionality. To avoid - * using Node.js or DOM-specific APIs, you can use `instantiateSha512`. + * using Node.js or DOM-specific APIs, you can use {@link instantiateSha512}. * * @param webassemblyBytes - A buffer containing the sha512 binary. */ @@ -84,18 +85,9 @@ export const instantiateSha512Bytes = async ( export const getEmbeddedSha512Binary = () => base64ToBin(sha512Base64Bytes).buffer; -const cachedSha512: { cache?: Promise } = {}; - /** - * An ultimately-portable (but slower) version of `instantiateSha512Bytes` - * which does not require the consumer to provide the sha512 binary buffer. + * An ultimately-portable (but slower) version of {@link instantiateSha512Bytes} + * that does not require the consumer to provide the sha512 binary buffer. */ -export const instantiateSha512 = async (): Promise => { - if (cachedSha512.cache !== undefined) { - return cachedSha512.cache; - } - const result = instantiateSha512Bytes(getEmbeddedSha512Binary()); - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement - cachedSha512.cache = result; - return result; -}; +export const instantiateSha512 = async (): Promise => + instantiateSha512Bytes(getEmbeddedSha512Binary()); diff --git a/src/lib/format/base-convert.spec.ts b/src/lib/format/base-convert.spec.ts index 69011836..b3a4760e 100644 --- a/src/lib/format/base-convert.spec.ts +++ b/src/lib/format/base-convert.spec.ts @@ -1,19 +1,19 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ -import test, { Macro } from 'ava'; +import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; +import type { BaseConverter } from '../lib'; import { base58ToBin, BaseConversionError, - BaseConverter, binToBase58, createBaseConverter, hexToBin, range, utf8ToBin, -} from '../lib'; +} from '../lib.js'; -import * as base58Json from './fixtures/base58_encode_decode.json'; +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import base58Json from './fixtures/base58_encode_decode.json' assert { type: 'json' }; const base58Vectors = Object.values(base58Json).filter( (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') @@ -21,13 +21,13 @@ const base58Vectors = Object.values(base58Json).filter( const base2 = createBaseConverter('01') as BaseConverter; -const base2Vector: Macro<[string, Uint8Array]> = (t, string, bin) => { - t.deepEqual(base2.decode(string), bin); - t.deepEqual(base2.encode(bin), string); -}; - -// eslint-disable-next-line functional/immutable-data -base2Vector.title = (_, string) => `createBaseConverter – base2: ${string}`; +const base2Vector = test.macro<[string, Uint8Array]>({ + exec: (t, string, bin) => { + t.deepEqual(base2.decode(string), bin); + t.deepEqual(base2.encode(bin), string); + }, + title: (_, string) => `createBaseConverter – base2: ${string}`, +}); test(base2Vector, '', Uint8Array.of()); test(base2Vector, '0', Uint8Array.of(0)); @@ -45,13 +45,13 @@ test( const base16 = createBaseConverter('0123456789abcdef') as BaseConverter; -const base16Vector: Macro<[string, Uint8Array]> = (t, string, bin) => { - t.deepEqual(base16.decode(string), bin); - t.deepEqual(base16.encode(bin), string); -}; - -// eslint-disable-next-line functional/immutable-data -base16Vector.title = (_, string) => `createBaseConverter – base16: ${string}`; +const base16Vector = test.macro<[string, Uint8Array]>({ + exec: (t, string, bin) => { + t.deepEqual(base16.decode(string), bin); + t.deepEqual(base16.encode(bin), string); + }, + title: (_, string) => `createBaseConverter – base16: ${string}`, +}); test(base16Vector, '', Uint8Array.of()); test(base16Vector, '0', Uint8Array.of(0)); @@ -59,13 +59,13 @@ test(base16Vector, '000f', Uint8Array.of(0, 0, 0, 15)); test(base16Vector, '0fff', Uint8Array.of(0, 15, 255)); test(base16Vector, 'ffff', Uint8Array.of(255, 255)); -const base58Vector: Macro<[string, Uint8Array]> = (t, string, bin) => { - t.deepEqual(base58ToBin(string), bin); - t.deepEqual(binToBase58(bin), string); -}; - -// eslint-disable-next-line functional/immutable-data -base58Vector.title = (_, string) => `base58ToBin – binToBase58: ${string}`; +const base58Vector = test.macro<[string, Uint8Array]>({ + exec: (t, string, bin) => { + t.deepEqual(base58ToBin(string), bin); + t.deepEqual(binToBase58(bin), string); + }, + title: (_, string) => `base58ToBin – binToBase58: ${string}`, +}); test(base58Vector, '', Uint8Array.of()); test(base58Vector, '1', Uint8Array.of(0)); @@ -170,7 +170,9 @@ test('base58 Test Vectors', (t) => { t.truthy(base58Vectors); // eslint-disable-next-line functional/no-loop-statement for (const [binHex, base58] of base58Vectors) { - t.deepEqual(base58ToBin(base58) as Uint8Array, hexToBin(binHex)); - t.deepEqual(binToBase58(hexToBin(binHex)), base58); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + t.deepEqual(base58ToBin(base58!) as Uint8Array, hexToBin(binHex!)); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + t.deepEqual(binToBase58(hexToBin(binHex!)), base58); } }); diff --git a/src/lib/format/base-convert.ts b/src/lib/format/base-convert.ts index b03055f9..6d5b6851 100644 --- a/src/lib/format/base-convert.ts +++ b/src/lib/format/base-convert.ts @@ -5,12 +5,12 @@ export enum BaseConversionError { } export interface BaseConverter { - decode: (source: string) => Uint8Array | BaseConversionError.unknownCharacter; + decode: (source: string) => BaseConversionError.unknownCharacter | Uint8Array; encode: (input: Uint8Array) => string; } /** - * Create a `BaseConverter`, which exposes methods for encoding and decoding + * Create a {@link BaseConverter}, exposing methods for encoding and decoding * `Uint8Array`s using bitcoin-style padding: each leading zero in the input is * replaced with the zero-index character of the `alphabet`, then the remainder * of the input is encoded as a large number in the specified alphabet. @@ -25,12 +25,10 @@ export interface BaseConverter { * * If the alphabet is malformed, this method returns the error as a `string`. * - * @param alphabet - an ordered string which maps each index to a character, + * @param alphabet - an ordered string that maps each index to a character, * e.g. `0123456789`. - * @privateRemarks - * Algorithm from the `base-x` implementation (which is derived from the - * original Satoshi implementation): https://github.com/cryptocoinjs/base-x */ +// Algorithm from the `base-x` implementation (derived from the original Satoshi implementation): https://github.com/cryptocoinjs/base-x export const createBaseConverter = ( alphabet: string ): BaseConversionError | BaseConverter => { @@ -78,8 +76,9 @@ export const createBaseConverter = ( let remainingBytes = 0; // eslint-disable-next-line functional/no-loop-statement - while ((input[nextByte] as string | undefined) !== undefined) { - let carry = alphabetMap[input.charCodeAt(nextByte)]; + while (input[nextByte] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + let carry = alphabetMap[input.charCodeAt(nextByte)]!; if (carry === undefinedValue) return BaseConversionError.unknownCharacter; @@ -91,7 +90,8 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus steps--, digit++ ) { - carry += Math.floor(base * decoded[steps]); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + carry += Math.floor(base * decoded[steps]!); // eslint-disable-next-line functional/immutable-data decoded[steps] = Math.floor(carry % uint8ArrayBase); carry = Math.floor(carry / uint8ArrayBase); @@ -131,7 +131,8 @@ export const createBaseConverter = ( let remainingBytes = 0; // eslint-disable-next-line functional/no-loop-statement while (nextByte !== input.length) { - let carry = input[nextByte]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + let carry = input[nextByte]!; let digit = 0; // eslint-disable-next-line functional/no-loop-statement for ( @@ -140,7 +141,8 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus steps--, digit++ ) { - carry += Math.floor(uint8ArrayBase * encoded[steps]); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + carry += Math.floor(uint8ArrayBase * encoded[steps]!); // eslint-disable-next-line functional/immutable-data encoded[steps] = Math.floor(carry % base); carry = Math.floor(carry / base); @@ -169,7 +171,7 @@ const base58 = createBaseConverter(bitcoinBase58Alphabet) as BaseConverter; /** * Convert a bitcoin-style base58-encoded string to a Uint8Array. * - * See `createBaseConverter` for format details. + * See {@link createBaseConverter} for format details. * @param input - a valid base58-encoded string to decode */ export const base58ToBin = base58.decode; @@ -177,7 +179,7 @@ export const base58ToBin = base58.decode; /** * Convert a Uint8Array to a bitcoin-style base58-encoded string. * - * See `createBaseConverter` for format details. + * See {@link createBaseConverter} for format details. * @param input - the Uint8Array to base58 encode */ export const binToBase58 = base58.encode; diff --git a/src/lib/format/base64.spec.ts b/src/lib/format/base64.spec.ts index 33b9ac01..f7a629f6 100644 --- a/src/lib/format/base64.spec.ts +++ b/src/lib/format/base64.spec.ts @@ -1,7 +1,6 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; -import { base64ToBin, binToBase64, isBase64 } from '../lib'; +import { base64ToBin, binToBase64, isBase64 } from '../lib.js'; test('isBase64', (t) => { t.deepEqual(isBase64('YWJj'), true); diff --git a/src/lib/format/base64.ts b/src/lib/format/base64.ts index b57984db..3243ac5f 100644 --- a/src/lib/format/base64.ts +++ b/src/lib/format/base64.ts @@ -7,22 +7,22 @@ const base64GroupLength = 4; const nonBase64Chars = new RegExp(`[^${chars}=]`, 'u'); /** - * For use before `base64ToBin`. Returns true if the provided string is valid - * base64 (length is divisible by 4, only uses base64 characters). - * @param maybeHex - a string to test + * For use before {@link base64ToBin}. Returns true if the provided string is + * valid base64 (length is divisible by 4, only uses base64 characters). + * @param maybeBase64 - a string to test */ export const isBase64 = (maybeBase64: string) => maybeBase64.length % base64GroupLength === 0 && !nonBase64Chars.test(maybeBase64); -/* eslint-disable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus */ +/* eslint-disable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ /** * Convert a base64-encoded string to a Uint8Array. * * Note, this method always completes. If `validBase64` is not valid base64, an * incorrect result will be returned. If `validBase64` is potentially malformed, - * check it with `isBase64` before calling this method. + * check it with {@link isBase64} before calling this method. * * @param validBase64 - a valid base64-encoded string to decode */ @@ -46,10 +46,10 @@ export const base64ToBin = (validBase64: string) => { let p = 0; // eslint-disable-next-line functional/no-let, functional/no-loop-statement for (let i = 0; i < stringLength; i += 4) { - const encoded1 = lookup[validBase64.charCodeAt(i)]; - const encoded2 = lookup[validBase64.charCodeAt(i + 1)]; - const encoded3 = lookup[validBase64.charCodeAt(i + 2)]; - const encoded4 = lookup[validBase64.charCodeAt(i + 3)]; + const encoded1 = lookup[validBase64.charCodeAt(i)]!; + const encoded2 = lookup[validBase64.charCodeAt(i + 1)]!; + const encoded3 = lookup[validBase64.charCodeAt(i + 2)]!; + const encoded4 = lookup[validBase64.charCodeAt(i + 3)]!; bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); @@ -66,10 +66,10 @@ export const binToBase64 = (bytes: Uint8Array) => { let result = ''; // eslint-disable-next-line functional/no-let, functional/no-loop-statement for (let i = 0; i < bytes.length; i += 3) { - result += chars[bytes[i] >> 2]; - result += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; - result += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; - result += chars[bytes[i + 2] & 63]; + result += chars[bytes[i]! >> 2]; + result += chars[((bytes[i]! & 3) << 4) | (bytes[i + 1]! >> 4)]; + result += chars[((bytes[i + 1]! & 15) << 2) | (bytes[i + 2]! >> 6)]; + result += chars[bytes[i + 2]! & 63]; } const padded = bytes.length % 3 === 2 @@ -79,4 +79,4 @@ export const binToBase64 = (bytes: Uint8Array) => { : result; return padded; }; -/* eslint-enable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus */ +/* eslint-enable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/format/bin-string.spec.ts b/src/lib/format/bin-string.spec.ts index af1fe470..9e48514f 100644 --- a/src/lib/format/bin-string.spec.ts +++ b/src/lib/format/bin-string.spec.ts @@ -1,8 +1,7 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; -import { binStringToBin, binToBinString, isBinString } from '../lib'; +import { binStringToBin, binToBinString, isBinString } from '../lib.js'; const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => diff --git a/src/lib/format/bin-string.ts b/src/lib/format/bin-string.ts index 2a715916..c87b53c4 100644 --- a/src/lib/format/bin-string.ts +++ b/src/lib/format/bin-string.ts @@ -1,4 +1,4 @@ -import { splitEvery } from './hex'; +import { splitEvery } from './hex.js'; const binaryByteWidth = 8; const binary = 2; @@ -36,8 +36,8 @@ export const binToBinString = (bytes: Uint8Array) => ); /** - * For use before `binStringToBin`. Returns true if the provided string is a - * valid binary string (length is divisible by 8 and only uses the characters + * For use before {@link binStringToBin}. Returns true if the provided string is + * a valid binary string (length is divisible by 8 and only uses the characters * `0` and `1`). * @param maybeBinString - a string to test */ diff --git a/src/lib/format/format.ts b/src/lib/format/format.ts index ba986875..2e71dd96 100644 --- a/src/lib/format/format.ts +++ b/src/lib/format/format.ts @@ -1,9 +1,9 @@ -export * from './hex'; -export * from './bin-string'; -export * from './base-convert'; -export * from './base64'; -export * from './numbers'; -export * from './log'; -export * from './time'; -export * from './type-utils'; -export * from './utf8'; +export * from './base-convert.js'; +export * from './base64.js'; +export * from './bin-string.js'; +export * from './hex.js'; +export * from './log.js'; +export * from './numbers.js'; +export * from './time.js'; +export * from './type-utils.js'; +export * from './utf8.js'; diff --git a/src/lib/format/hex.spec.ts b/src/lib/format/hex.spec.ts index cd5c93a3..a52da506 100644 --- a/src/lib/format/hex.spec.ts +++ b/src/lib/format/hex.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; @@ -9,7 +8,7 @@ import { range, splitEvery, swapEndianness, -} from '../lib'; +} from '../lib.js'; const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => diff --git a/src/lib/format/hex.ts b/src/lib/format/hex.ts index 4425e030..ce211043 100644 --- a/src/lib/format/hex.ts +++ b/src/lib/format/hex.ts @@ -1,5 +1,6 @@ /** - * Returns an array of incrementing values starting at `begin` and incrementing by one for `length`. + * Returns an array of incrementing values starting at `begin` and incrementing + * by one for `length`. * * E.g.: `range(3)` → `[0, 1, 2]` and `range(3, 1)` → `[1, 2, 3]` * @@ -10,7 +11,8 @@ export const range = (length: number, begin = 0) => Array.from({ length }, (_, index) => begin + index); /** - * Split a string into an array of `chunkLength` strings. The final string may have a length between 1 and `chunkLength`. + * Split a string into an array of `chunkLength` strings. The final string may + * have a length between 1 and `chunkLength`. * * E.g.: `splitEvery('abcde', 2)` → `['ab', 'cd', 'e']` */ @@ -30,7 +32,7 @@ const hexadecimal = 16; * Note, this method always completes. If `validHex` is not divisible by 2, * the final byte will be parsed as if it were prepended with a `0` (e.g. `aaa` * is interpreted as `aa0a`). If `validHex` is potentially malformed, check - * it with `isHex` before calling this method. + * it with {@link isHex} before calling this method. * * @param validHex - a string of valid, hexadecimal-encoded data */ @@ -42,7 +44,7 @@ export const hexToBin = (validHex: string) => ); /** - * For use before `hexToBin`. Returns true if the provided string is valid + * For use before {@link hexToBin}. Returns true if the provided string is valid * hexadecimal (length is divisible by 2, only uses hexadecimal characters). * @param maybeHex - a string to test */ @@ -66,7 +68,7 @@ export const binToHex = (bytes: Uint8Array) => * Decode a hexadecimal-encoded string into bytes, reverse it, then re-encode. * * @param validHex - a string of valid, hexadecimal-encoded data. See - * `hexToBin` for more information. + * {@link hexToBin} for more information. */ export const swapEndianness = (validHex: string) => binToHex(hexToBin(validHex).reverse()); diff --git a/src/lib/format/log.spec.ts b/src/lib/format/log.spec.ts index 735c8922..72053e2e 100644 --- a/src/lib/format/log.spec.ts +++ b/src/lib/format/log.spec.ts @@ -1,7 +1,6 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; -import { sortObjectKeys, stringify, stringifyTestVector } from '../lib'; +import { sortObjectKeys, stringify, stringifyTestVector } from '../lib.js'; test('stringify', (t) => { t.deepEqual(stringify(BigInt(0)), '""'); diff --git a/src/lib/format/log.ts b/src/lib/format/log.ts index ffeaeb24..d0eee761 100644 --- a/src/lib/format/log.ts +++ b/src/lib/format/log.ts @@ -1,4 +1,4 @@ -import { binToHex } from './hex'; +import { binToHex } from './hex.js'; const defaultStringifySpacing = 2; @@ -10,7 +10,7 @@ const defaultStringifySpacing = 2; * Without modifications, `JSON.stringify` has several shortcomings in * debugging and logging usage: * - throws when serializing anything containing a `bigint` - * - `Uint8Array`s are often serialized in base 10 with newlines between each + * - `Uint8Array`s are often encoded in base 10 with newlines between each * index item * - `functions` and `symbols` are not clearly marked * @@ -20,7 +20,7 @@ const defaultStringifySpacing = 2; * - `function`: `(x) => x * 2` → ` x * 2>` * - `symbol`: `Symbol(A)` → `` * - * @param value - the data to serialize + * @param value - the data to stringify * @param spacing - the number of spaces to use in */ // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -42,7 +42,7 @@ export const stringify = (value: any, spacing = defaultStringifySpacing) => case 'function': case 'symbol': // eslint-disable-next-line @typescript-eslint/ban-types - return `<${name}: ${(item as symbol | Function).toString()}>`; + return `<${name}: ${(item as Function | symbol).toString()}>`; default: return item; } @@ -72,7 +72,9 @@ export const sortObjectKeys = ( return objectOrArray; } // eslint-disable-next-line functional/immutable-data - const keys = Object.keys(objectOrArray).sort((a, b) => a.localeCompare(b)); + const keys = Object.keys(objectOrArray).sort((a, b) => + a.localeCompare(b, 'en') + ); return keys.reduce( (all, key) => ({ ...all, @@ -87,17 +89,19 @@ const uint8ArrayRegex = /"[0-9a-f]*)>"/gu; const bigIntRegex = /"[0-9]*)n>"/gu; /** - * An alternative to `stringify` which produces valid JavaScript for use as a - * test vector in this library. `Uint8Array`s are constructed using `hexToBin` - * and `bigint` values use the `BigInt` constructor. If `alphabetize` is `true`, - * all objects will be sorted in the output. + * An alternative to {@link stringify} that produces valid JavaScript for use + * as a test vector in this library. `Uint8Array`s are constructed using + * {@link hexToBin} and `bigint` values use the `BigInt` constructor. If + * `alphabetize` is `true`, all objects will be sorted in the output. * - * Note, this assumes all strings which match the expected regular expressions + * Note, this assumes all strings that match the expected regular expressions * are values of type `Uint8Array` and `bigint` respectively. String values - * which otherwise happen to match these regular expressions will be converted + * that otherwise happen to match these regular expressions will be converted * incorrectly. * - * @param stringified - the result of `stringify` + * @param value - the value to stringify + * @param alphabetize - whether or not to alphabetize object keys, defaults + * to true */ export const stringifyTestVector = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/lib/format/message/transaction-encoding.spec.ts b/src/lib/format/message/transaction-encoding.spec.ts new file mode 100644 index 00000000..c6dc9e64 --- /dev/null +++ b/src/lib/format/message/transaction-encoding.spec.ts @@ -0,0 +1,252 @@ +import test from 'ava'; + +import type { TransactionCommon } from '../../lib'; +import { + bigIntToBinUint64LE, + decodeTransactionCommon, + encodeTransactionCommon, + hashTransaction, + hashTransactionP2pOrder, + hashTransactionUiOrder, + hexToBin, + sha256, + TransactionDecodingError, +} from '../../lib.js'; + +test('decodeTransaction', (t) => { + /** + * Example transaction: + * + * 3eb87070 ← version + * + * 04 ← number of inputs + * + * Input 1 outpointTransactionHash (reverse byte order): + * 2d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e + * 03000000 ← outpointIndex (BinUint32LE) + * 06 ← bytecodeLength (Bitcoin VarInt) + * 6a0065525365 ← bytecode + * ffffffff ← sequence number (BinUint32LE) + * + * Input 2: + * d14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd + * 03000000 + * 08 + * 63acac0053520052 + * 7ff62cf3 + * + * Input 3: + * ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0 + * 02000000 + * 01 + * 00 + * ffffffff + * + * Input 4: + * 6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba + * 01000000 + * 05 + * 5351ac526a + * a3b8223d + * + * 04 ← number of outputs + * + * Output 1: + * 21f25b0400000000 ← satoshis (BinUint64LE) + * 02 ← bytecodeLength (Bitcoin VarInt) + * 6552 ← lockingBytecode + * + * Output 2: + * f92db70500000000 + * 07 + * 5253516a656a53 + * + * Output 3: + * c4a9080100000000 + * 00 + * + * Output 4: + * b519290100000000 + * 06 + * 52525251516a + * + * a148ca38 ← locktime (BinUint32LE) + */ + const tx = hexToBin( + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' + ); + t.deepEqual(decodeTransactionCommon(tx), { + inputs: [ + { + outpointIndex: 3, + outpointTransactionHash: hexToBin( + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + ), + sequenceNumber: 4294967295, + unlockingBytecode: hexToBin('6a0065525365'), + }, + { + outpointIndex: 3, + outpointTransactionHash: hexToBin( + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + ), + sequenceNumber: 4079810175, + unlockingBytecode: hexToBin('63acac0053520052'), + }, + { + outpointIndex: 2, + outpointTransactionHash: hexToBin( + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + ), + sequenceNumber: 4294967295, + unlockingBytecode: hexToBin('00'), + }, + { + outpointIndex: 1, + outpointTransactionHash: hexToBin( + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + ), + sequenceNumber: 1025685667, + unlockingBytecode: hexToBin('5351ac526a'), + }, + ], + locktime: 952780961, + outputs: [ + { + lockingBytecode: hexToBin('6552'), + valueSatoshis: bigIntToBinUint64LE(BigInt(73134625)), + }, + { + lockingBytecode: hexToBin('5253516a656a53'), + valueSatoshis: bigIntToBinUint64LE(BigInt(95890937)), + }, + { + lockingBytecode: hexToBin(''), + valueSatoshis: bigIntToBinUint64LE(BigInt(17344964)), + }, + { + lockingBytecode: hexToBin('52525251516a'), + valueSatoshis: bigIntToBinUint64LE(BigInt(19470773)), + }, + ], + version: 1886435390, + }); +}); + +test('encodeTransaction', (t) => { + const tx = { + inputs: [ + { + outpointIndex: 3, + outpointTransactionHash: hexToBin( + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + ), + sequenceNumber: 4294967295, + unlockingBytecode: hexToBin('6a0065525365'), + }, + { + outpointIndex: 3, + outpointTransactionHash: hexToBin( + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + ), + sequenceNumber: 4079810175, + unlockingBytecode: hexToBin('63acac0053520052'), + }, + { + outpointIndex: 2, + outpointTransactionHash: hexToBin( + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + ), + sequenceNumber: 4294967295, + unlockingBytecode: hexToBin('00'), + }, + { + outpointIndex: 1, + outpointTransactionHash: hexToBin( + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + ), + sequenceNumber: 1025685667, + unlockingBytecode: hexToBin('5351ac526a'), + }, + ], + locktime: 952780961, + outputs: [ + { + lockingBytecode: hexToBin('6552'), + valueSatoshis: bigIntToBinUint64LE(BigInt(73134625)), + }, + { + lockingBytecode: hexToBin('5253516a656a53'), + valueSatoshis: bigIntToBinUint64LE(BigInt(95890937)), + }, + { + lockingBytecode: hexToBin(''), + valueSatoshis: bigIntToBinUint64LE(BigInt(17344964)), + }, + { + lockingBytecode: hexToBin('52525251516a'), + valueSatoshis: bigIntToBinUint64LE(BigInt(19470773)), + }, + ], + version: 1886435390, + }; + t.deepEqual( + encodeTransactionCommon(tx), + hexToBin( + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' + ) + ); +}); + +test('decode and encode transaction', (t) => { + const tx = + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38'; + t.deepEqual( + hexToBin(tx), + encodeTransactionCommon( + decodeTransactionCommon(hexToBin(tx)) as TransactionCommon + ) + ); +}); + +test('decodeTransaction: invalid', (t) => { + t.deepEqual( + decodeTransactionCommon(hexToBin('00')), + TransactionDecodingError.invalidFormat + ); +}); + +test('hashTransaction, hashTransactionUiOrder, hashTransactionP2pOrder', (t) => { + const tx = + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38'; + const txId = + '67adfe4f2b374e770584d2d0beb8eacc7b29287a47d2ffe511fa81f48e0ec4fb'; + const halTx = + '0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000'; + const halTxId = + 'f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16'; + + t.deepEqual(hashTransaction(hexToBin(tx)), txId); + t.deepEqual(hashTransactionUiOrder(hexToBin(tx)), hexToBin(txId)); + t.deepEqual(hashTransactionUiOrder(hexToBin(tx), sha256), hexToBin(txId)); + t.deepEqual(hashTransactionP2pOrder(hexToBin(tx)), hexToBin(txId).reverse()); + t.deepEqual( + hashTransactionP2pOrder(hexToBin(tx), sha256), + hexToBin(txId).reverse() + ); + + t.deepEqual(hashTransaction(hexToBin(halTx)), halTxId); + t.deepEqual(hashTransactionUiOrder(hexToBin(halTx)), hexToBin(halTxId)); + t.deepEqual( + hashTransactionUiOrder(hexToBin(halTx), sha256), + hexToBin(halTxId) + ); + t.deepEqual( + hashTransactionP2pOrder(hexToBin(halTx)), + hexToBin(halTxId).reverse() + ); + t.deepEqual( + hashTransactionP2pOrder(hexToBin(halTx), sha256), + hexToBin(halTxId).reverse() + ); +}); diff --git a/src/lib/format/numbers.bench.ts b/src/lib/format/numbers.bench.ts index d8d722b2..875ed11d 100644 --- a/src/lib/format/numbers.bench.ts +++ b/src/lib/format/numbers.bench.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement */ +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations */ import { randomBytes } from 'crypto'; @@ -17,7 +17,7 @@ import { numberToBinUint16LEClamped, numberToBinUint32LE, numberToBinUint32LEClamped, -} from '../lib'; +} from '../lib.js'; test(`node: binToBigIntUintBE vs. binToHex -> BigInt()`, async (t) => { await suite(t.title, (s) => { diff --git a/src/lib/format/numbers.spec.ts b/src/lib/format/numbers.spec.ts index 3375c068..2a798f19 100644 --- a/src/lib/format/numbers.spec.ts +++ b/src/lib/format/numbers.spec.ts @@ -1,5 +1,4 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ -import test, { Macro } from 'ava'; +import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; import { @@ -7,7 +6,7 @@ import { bigIntToBinUint64LE, bigIntToBinUint64LEClamped, bigIntToBinUintLE, - bigIntToBitcoinVarInt, + bigIntToVarInt, binToBigIntUint256BE, binToBigIntUint64LE, binToBigIntUintBE, @@ -18,6 +17,7 @@ import { binToNumberUint16LE, binToNumberUint32LE, binToNumberUintLE, + decodeVarInt, hexToBin, numberToBinInt16LE, numberToBinInt32LE, @@ -29,9 +29,8 @@ import { numberToBinUint32LE, numberToBinUint32LEClamped, numberToBinUintLE, - readBitcoinVarInt, varIntPrefixToSize, -} from '../lib'; +} from '../lib.js'; test('numberToBinUint16LE', (t) => { t.deepEqual(numberToBinUint16LE(0), Uint8Array.from([0, 0])); @@ -210,9 +209,9 @@ test('bigIntToBinUint64LE vs. bigIntToBinUint64LEClamped: behavior on negative n ); }); -test('bigIntToBitcoinVarInt: larger values return modulo result after opcode', (t) => { +test('bigIntToVarInt: larger values return modulo result after opcode', (t) => { t.deepEqual( - bigIntToBitcoinVarInt(BigInt('0x010000000000000001')), + bigIntToVarInt(BigInt('0x010000000000000001')), Uint8Array.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) ); }); @@ -342,7 +341,7 @@ test('binToBigIntUint256BE and bigIntToBinUint256BEClamped', (t) => { const max = new Uint8Array(32); max.fill(255); const overMax = new Uint8Array(33); - // eslint-disable-next-line functional/immutable-data + overMax[0] = 255; t.deepEqual( bigIntToBinUint256BEClamped(BigInt(`0x${binToHex(overMax)}`)), @@ -424,16 +423,7 @@ test('binToBigIntUint64LE', (t) => { t.deepEqual( binToBigIntUint64LE( Uint8Array.from([ - 0xef, - 0xcd, - 0xab, - 0x89, - 0x67, - 0x45, - 0x23, - 0x01, - 0x00, - 0x00, + 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00, ]) ), BigInt('0x0123456789abcdef') @@ -446,33 +436,26 @@ test('binToBigIntUint64LE', (t) => { ); }); -test('readBitcoinVarInt: offset is optional', (t) => { - t.deepEqual(readBitcoinVarInt(hexToBin('00')), { - nextOffset: 1, +test('decodeVarInt: index is optional', (t) => { + t.deepEqual(decodeVarInt(hexToBin('00')), { + nextIndex: 1, value: BigInt(0x00), }); }); -const varIntVector: Macro<[string, bigint, number, number?, string?]> = ( - t, - hex, - value, - nextOffset, - start = 0, - expected = hex +const varIntVector = test.macro<[string, bigint, number, number?, string?]>({ // eslint-disable-next-line max-params -) => { - t.deepEqual(readBitcoinVarInt(hexToBin(hex), start), { - nextOffset, - value, - }); - t.deepEqual(bigIntToBitcoinVarInt(value), hexToBin(expected)); -}; - -// eslint-disable-next-line functional/immutable-data -varIntVector.title = (_, string) => - `readBitcoinVarInt/bigIntToBitcoinVarInt: ${string}`; + exec: (t, hex, value, nextIndex, start = 0, expected = hex) => { + t.deepEqual(decodeVarInt(hexToBin(hex), start), { + nextIndex, + value, + }); + t.deepEqual(bigIntToVarInt(value), hexToBin(expected)); + }, + title: (_, string) => `decodeVarInt/bigIntToVarInt: ${string}`, +}); +/* spell-checker: disable */ test(varIntVector, '00', BigInt(0x00), 1); test(varIntVector, '01', BigInt(0x01), 1); test(varIntVector, '12', BigInt(0x12), 1); @@ -494,6 +477,8 @@ test(varIntVector, 'fe11111111', BigInt(0x11111111), 5); test(varIntVector, 'fe12345678', BigInt(0x78563412), 5); test(varIntVector, 'feffffffff', BigInt(0xffffffff), 5); test(varIntVector, 'ff0000000001000000', BigInt(0x0100000000), 9); +/* spell-checker: enable */ + test( varIntVector, '0000ff0000000001000000', @@ -507,12 +492,13 @@ test(varIntVector, 'ff1111111111111111', BigInt('0x1111111111111111'), 9); test(varIntVector, 'ff1234567890abcdef', BigInt('0xefcdab9078563412'), 9); testProp( - '[fast-check] bigIntToBitcoinVarInt <-> readBitcoinVarInt', + '[fast-check] bigIntToVarInt <-> decodeVarInt', [fc.bigUintN(64)], (t, uint64) => { - const varInt = bigIntToBitcoinVarInt(uint64); - const expectedOffset = varIntPrefixToSize(varInt[0]); - const result = readBitcoinVarInt(varInt); - t.deepEqual(result, { nextOffset: expectedOffset, value: uint64 }); + const varInt = bigIntToVarInt(uint64); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const expectedIndex = varIntPrefixToSize(varInt[0]!); + const result = decodeVarInt(varInt); + t.deepEqual(result, { nextIndex: expectedIndex, value: uint64 }); } ); diff --git a/src/lib/format/numbers.ts b/src/lib/format/numbers.ts index 56c586b5..ac74ba4a 100644 --- a/src/lib/format/numbers.ts +++ b/src/lib/format/numbers.ts @@ -34,7 +34,6 @@ export const binToFixedLength = (bin: Uint8Array, bytes: number) => { const maxValue = 255; // eslint-disable-next-line functional/no-expression-statement bin.length > bytes ? fixedBytes.fill(maxValue) : fixedBytes.set(bin); - // TODO: re-enable eslint-disable-next-line @typescript-eslint/no-unused-expressions return fixedBytes; }; @@ -265,9 +264,9 @@ export const numberToBinInt32TwosCompliment = (value: number) => { const bitsInAByte = 8; const bin = new Uint8Array(bytes); // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus - for (let offset = 0; offset < bytes; offset++) { + for (let index = 0; index < bytes; index++) { // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - bin[offset] = value; + bin[index] = value; // eslint-disable-next-line functional/no-expression-statement, no-bitwise, no-param-reassign value >>>= bitsInAByte; } @@ -293,7 +292,7 @@ export const numberToBinInt32TwosCompliment = (value: number) => { export const binToNumberUintLE = (bin: Uint8Array, bytes = bin.length) => { const base = 2; const bitsInAByte = 8; - // eslint-disable-next-line functional/no-conditional-statement + if (bin.length !== bytes) { // eslint-disable-next-line functional/no-throw-statement throw new TypeError(`Bin length must be ${bytes}.`); @@ -346,7 +345,7 @@ export const binToNumberUint32LE = (bin: Uint8Array) => { export const binToBigIntUintBE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; const shift = BigInt(bitsInAByte); - // eslint-disable-next-line functional/no-conditional-statement + if (bin.length !== bytes) { // eslint-disable-next-line functional/no-throw-statement throw new TypeError(`Bin length must be ${bytes}.`); @@ -401,7 +400,7 @@ export const bigIntToBinUint256BEClamped = (value: bigint) => { */ export const binToBigIntUintLE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; - // eslint-disable-next-line functional/no-conditional-statement + if (bin.length !== bytes) { // eslint-disable-next-line functional/no-throw-statement throw new TypeError(`Bin length must be ${bytes}.`); @@ -434,6 +433,10 @@ const enum VarInt { uint32Prefix = 0xfe, uint32MaxValue = 0xffffffff, uint64Prefix = 0xff, + uint8 = 1, + uint16 = 2, + uint32 = 4, + uint64 = 8, } /** @@ -442,50 +445,51 @@ const enum VarInt { * @param firstByte - the first byte of the VarInt */ export const varIntPrefixToSize = (firstByte: number) => { - const uint8 = 1; - const uint16 = 2; - const uint32 = 4; - const uint64 = 8; switch (firstByte) { case VarInt.uint16Prefix: - return uint16 + 1; + return VarInt.uint16 + 1; case VarInt.uint32Prefix: - return uint32 + 1; + return VarInt.uint32 + 1; case VarInt.uint64Prefix: - return uint64 + 1; + return VarInt.uint64 + 1; default: - return uint8; + return VarInt.uint8; } }; /** - * Read a Bitcoin VarInt (Variable-length integer) from a Uint8Array, returning - * the `nextOffset` after the VarInt and the value as a BigInt. + * Decode a VarInt (Satoshi's Variable-length integer format) from a Uint8Array, + * returning the `nextIndex` after the VarInt and the value as a BigInt. + * + * Note: throws a runtime error if `bin` has a length of `0`. * * @param bin - the Uint8Array from which to read the VarInt - * @param offset - the offset at which the VarInt begins + * @param index - the index at which the VarInt begins */ -export const readBitcoinVarInt = (bin: Uint8Array, offset = 0) => { - const bytes = varIntPrefixToSize(bin[offset]); +export const decodeVarInt = (bin: Uint8Array, index = 0) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const bytes = varIntPrefixToSize(bin[index]!); const hasPrefix = bytes !== 1; return { - nextOffset: offset + bytes, + nextIndex: index + bytes, value: hasPrefix - ? binToBigIntUintLE(bin.subarray(offset + 1, offset + bytes), bytes - 1) - : binToBigIntUintLE(bin.subarray(offset, offset + bytes), 1), + ? binToBigIntUintLE(bin.subarray(index + 1, index + bytes), bytes - 1) + : binToBigIntUintLE(bin.subarray(index, index + bytes), 1), }; }; /** - * Encode a positive BigInt as a Bitcoin VarInt (Variable-length integer). + * Encode a positive BigInt as a VarInt (Satoshi's Variable-length integer). * - * Note: the maximum value of a Bitcoin VarInt is `0xffff_ffff_ffff_ffff`. This - * method will return an incorrect result for values outside of the range `0` to - * `0xffff_ffff_ffff_ffff`. + * Note: the maximum value of a VarInt is `0xffff_ffff_ffff_ffff`. This method + * will return an incorrect result for values outside of the range `0` to + * `0xffff_ffff_ffff_ffff`. If applicable, applications should handle such cases + * prior to calling this method. * - * @param value - the BigInt to encode (no larger than `0xffff_ffff_ffff_ffff`) + * @param value - the BigInt to encode (must be no larger than + * `0xffff_ffff_ffff_ffff`) */ -export const bigIntToBitcoinVarInt = (value: bigint) => +export const bigIntToVarInt = (value: bigint) => value <= BigInt(VarInt.uint8MaxValue) ? Uint8Array.of(Number(value)) : value <= BigInt(VarInt.uint16MaxValue) diff --git a/src/lib/format/time.spec.ts b/src/lib/format/time.spec.ts index a1afbf6a..5acb461b 100644 --- a/src/lib/format/time.spec.ts +++ b/src/lib/format/time.spec.ts @@ -1,10 +1,10 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; import { dateToLocktime, dateToLocktimeBin, + decodeLocktime, hexToBin, LocktimeError, locktimeToDate, @@ -12,8 +12,7 @@ import { maximumLocktimeTimestamp, minimumLocktimeDate, minimumLocktimeTimestamp, - parseLocktimeBin, -} from '../lib'; +} from '../lib.js'; test('dateToLocktime', (t) => { t.deepEqual(dateToLocktime(new Date('2019-10-13')), 1570924800); @@ -32,12 +31,12 @@ test('dateToLocktimeBin', (t) => { }); test('parseLockTime', (t) => { - t.deepEqual(parseLocktimeBin(hexToBin('0069a25d')), new Date('2019-10-13')); - t.deepEqual(parseLocktimeBin(hexToBin('d090371c')), 473403600); - t.deepEqual(parseLocktimeBin(hexToBin('')), LocktimeError.incorrectLength); - t.deepEqual(parseLocktimeBin(hexToBin('00')), LocktimeError.incorrectLength); + t.deepEqual(decodeLocktime(hexToBin('0069a25d')), new Date('2019-10-13')); + t.deepEqual(decodeLocktime(hexToBin('d090371c')), 473403600); + t.deepEqual(decodeLocktime(hexToBin('')), LocktimeError.incorrectLength); + t.deepEqual(decodeLocktime(hexToBin('00')), LocktimeError.incorrectLength); t.deepEqual( - parseLocktimeBin(hexToBin('0000000000')), + decodeLocktime(hexToBin('0000000000')), LocktimeError.incorrectLength ); }); @@ -50,16 +49,18 @@ testProp( ); testProp( - '[fast-check] dateToLocktimeBin <-> parseLocktimeBin', + '[fast-check] dateToLocktimeBin <-> decodeLocktime', [fc.date({ max: maximumLocktimeDate, min: minimumLocktimeDate })], (t, date) => { const withSecondResolution = new Date( Math.round(date.getTime() / 1000) * 1000 ); t.deepEqual( - (parseLocktimeBin( - dateToLocktimeBin(withSecondResolution) as Uint8Array - ) as Date).getTime(), + ( + decodeLocktime( + dateToLocktimeBin(withSecondResolution) as Uint8Array + ) as Date + ).getTime(), withSecondResolution.getTime() ); } diff --git a/src/lib/format/time.ts b/src/lib/format/time.ts index 1e48ee70..982c03d2 100644 --- a/src/lib/format/time.ts +++ b/src/lib/format/time.ts @@ -1,21 +1,21 @@ -import { binToNumberUint32LE, numberToBinUint32LE } from './numbers'; +import { binToNumberUint32LE, numberToBinUint32LE } from './numbers.js'; const msPerLocktimeSecond = 1000; /** - * The minimum Unix timestamp (inclusive) which can be encoded by a + * The minimum Unix timestamp (inclusive) that can be encoded by a * transaction's `locktime`. */ export const minimumLocktimeTimestamp = 500000000; /** - * The maximum Unix timestamp (inclusive) which can be encoded by a + * The maximum Unix timestamp (inclusive) that can be encoded by a * transaction's `locktime`. */ export const maximumLocktimeTimestamp = 0xffffffff; /** - * The minimum Date (inclusive) which can be encoded by a transaction's + * The minimum Date (inclusive) that can be encoded by a transaction's * `locktime`. */ export const minimumLocktimeDate = new Date( @@ -23,7 +23,7 @@ export const minimumLocktimeDate = new Date( ); /** - * The maximum Date (inclusive) which can be encoded by a transaction's + * The maximum Date (inclusive) that can be encoded by a transaction's * `locktime`. */ export const maximumLocktimeDate = new Date( @@ -31,8 +31,8 @@ export const maximumLocktimeDate = new Date( ); export enum LocktimeError { - dateOutOfRange = 'The provided Date is outside of the range which can be encoded in locktime.', - locktimeOutOfRange = 'The provided locktime is outside of the range which can be encoded as a Date (greater than or equal to 500000000 and less than or equal to 4294967295).', + dateOutOfRange = 'The provided Date is outside of the range that can be encoded in locktime.', + locktimeOutOfRange = 'The provided locktime is outside of the range that can be encoded as a Date (greater than or equal to 500000000 and less than or equal to 4294967295).', incorrectLength = 'The provided locktime is not the correct length (4 bytes).', } @@ -42,7 +42,7 @@ export enum LocktimeError { * `locktime` Dates). * * Note, a locktime values greater than or equal to `500000000` - * See `Transaction.locktime` for details. + * See {@link Transaction.locktime} for details. * * @param date - the Date to convert to a locktime number */ @@ -70,8 +70,9 @@ export const locktimeToDate = (locktime: number) => * bytecode representation. The `date` is rounded to the nearest second (the * precision of `locktime` Dates). * - * Note: a block-based locktime can simply be encoded with `numberToBinUint32LE` - * (provided it is no larger than the maximum, `499999999`). + * Note: a block-based locktime can simply be encoded with + * {@link numberToBinUint32LE} (provided it is no larger than the + * maximum, `499999999`). * * @param date - the Date to convert to a locktime Uint8Array */ @@ -82,12 +83,12 @@ export const dateToLocktimeBin = (date: Date) => { const locktimeByteLength = 4; /** - * Parse a locktime, returning a `number` for block heights, a `Date` for block + * Decode a locktime, returning a `number` for block heights, a `Date` for block * times, or a string for parsing errors. * * @param bin - the 4-byte Uint8Array locktime to parse */ -export const parseLocktimeBin = (bin: Uint8Array) => { +export const decodeLocktime = (bin: Uint8Array) => { if (bin.length !== locktimeByteLength) return LocktimeError.incorrectLength; const parsed = binToNumberUint32LE(bin); return parsed >= minimumLocktimeTimestamp diff --git a/src/lib/format/type-utils.ts b/src/lib/format/type-utils.ts index e267a633..4903843d 100644 --- a/src/lib/format/type-utils.ts +++ b/src/lib/format/type-utils.ts @@ -1,42 +1,88 @@ -type ImmutablePrimitive = - | undefined - | null - | boolean - | string - | number +/** + * An implementation of the built-in `Partial` utility that allows explicit + * `undefined` values when + * [exactOptionalPropertyTypes](https://www.typescriptlang.org/tsconfig#exactOptionalPropertyTypes) + * is enabled. + */ +export type PartialExactOptional = { + [P in keyof T]?: T[P] | undefined; +}; + +export type ImmutablePrimitive = // eslint-disable-next-line @typescript-eslint/ban-types - | Function; -type ImmutableArray = readonly Immutable[]; -type ImmutableMap = ReadonlyMap, Immutable>; -type ImmutableSet = ReadonlySet>; -type ImmutableObject = { + Function | boolean | number | string | null | undefined; +export type ImmutableArray = readonly Immutable[]; +export type ImmutableMap = ReadonlyMap, Immutable>; +export type ImmutableSet = ReadonlySet>; +export type ImmutableObject = { readonly [K in keyof T]: Immutable; }; -type ImmutableUint8Array = Readonly> & - Iterable & - ImmutableObject; +// Derived from: https://www.growingwiththeweb.com/2020/10/typescript-readonly-typed-arrays.html +export interface ImmutableUint8Array + extends Omit { + readonly [n: number]: number; +} /** - * A deep-readonly utility type. Can be removed when a built-in alternative is - * added to TypeScript. Derived from: - * https://github.com/microsoft/TypeScript/issues/13923#issuecomment-557509399 + * A deep-readonly utility type. Supports objects, `Array`s, `Uint8Array`s, + * `Map`s, and `Set`s. + * + * Note: `Uint8Array` is the only supported `TypedArray`. */ +// Derived from: https://github.com/microsoft/TypeScript/issues/13923#issuecomment-557509399 export type Immutable = T extends ImmutablePrimitive ? T : T extends (infer U)[] ? ImmutableArray + : T extends Uint8Array + ? ImmutableUint8Array : T extends Map ? ImmutableMap : T extends Set ? ImmutableSet - : T extends Uint8Array - ? ImmutableUint8Array : ImmutableObject; -/* - * const canBeAssigned: Immutable = Uint8Array.of(0, 0); - * const canBeSpread = [...canBeAssigned]; - * const spreadResultWorks = Uint8Array.from(canBeSpread); - * const functionRequiringIt = (bin: Immutable) => bin; - * const canAcceptNonMutable = functionRequiringIt(Uint8Array.of()); - */ +type FunctionComparisonEqualsWrapped = T extends ( // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-unused-vars + T extends {} ? infer R & {} : infer R +) + ? { + [P in keyof R]: R[P]; + } + : never; +type FunctionComparisonEquals = (< + T + // eslint-disable-next-line @typescript-eslint/no-magic-numbers +>() => T extends FunctionComparisonEqualsWrapped ? 1 : 2) extends < + T + // eslint-disable-next-line @typescript-eslint/no-magic-numbers +>() => T extends FunctionComparisonEqualsWrapped ? 1 : 2 + ? true + : false; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type IsAny = FunctionComparisonEquals; +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions, functional/no-mixed-type +type InvariantComparisonEqualsWrapped = { + value: T; + setValue: (value: T) => never; +}; +type InvariantComparisonEquals = + InvariantComparisonEqualsWrapped extends InvariantComparisonEqualsWrapped + ? IsAny extends true + ? IsAny | IsAny extends true + ? true + : false + : true + : false; + +// Derived from https://github.com/DetachHead/ts-helpers +type Equals = InvariantComparisonEquals< + Expected, + Actual +> extends true + ? FunctionComparisonEquals + : false; + +export type AssertTypesEqual = Equals extends true + ? true + : never; diff --git a/src/lib/format/utf8.spec.ts b/src/lib/format/utf8.spec.ts index 209ca3fb..6ceba568 100644 --- a/src/lib/format/utf8.spec.ts +++ b/src/lib/format/utf8.spec.ts @@ -1,14 +1,16 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; import { testProp } from 'ava-fast-check'; -import * as fc from 'fast-check'; +import fc from 'fast-check'; -import { binToUtf8, hexToBin, utf8ToBin } from '../lib'; +import { binToUtf8, hexToBin, utf8ToBin } from '../lib.js'; const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => fc - .array(fc.integer(0, maxUint8Number), minLength, maxLength) + .array(fc.integer({ max: maxUint8Number, min: 0 }), { + maxLength, + minLength, + }) .map((a) => Uint8Array.from(a)); test('utf8ToBin', (t) => { diff --git a/src/lib/format/utf8.ts b/src/lib/format/utf8.ts index fb3d4359..6d548ce1 100644 --- a/src/lib/format/utf8.ts +++ b/src/lib/format/utf8.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ /** * This implementations is derived from: * https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js @@ -61,24 +62,24 @@ export const binToUtf8 = (bytes: Uint8Array) => { let pos = 0; let c = 0; while (pos < bytes.length) { - const c1 = bytes[pos++]; + const c1 = bytes[pos++]!; if (c1 < 128) { out[c++] = String.fromCharCode(c1); } else if (c1 > 191 && c1 < 224) { - const c2 = bytes[pos++]; + const c2 = bytes[pos++]!; out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); } else if (c1 > 239 && c1 < 365) { - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; - const c4 = bytes[pos++]; + const c2 = bytes[pos++]!; + const c3 = bytes[pos++]!; + const c4 = bytes[pos++]!; const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - 0x10000; out[c++] = String.fromCharCode((u >> 10) + 0xd800); out[c++] = String.fromCharCode((u & 1023) + 0xdc00); } else { - const c2 = bytes[pos++]; - const c3 = bytes[pos++]; + const c2 = bytes[pos++]!; + const c3 = bytes[pos++]!; out[c++] = String.fromCharCode( ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63) ); diff --git a/src/lib/key/hd-key.spec.ts b/src/lib/key/hd-key.spec.ts index 20ab8c78..95eba2f4 100644 --- a/src/lib/key/hd-key.spec.ts +++ b/src/lib/key/hd-key.spec.ts @@ -1,9 +1,15 @@ -/* eslint-disable functional/no-expression-statement */ - -import test, { Macro } from 'ava'; +import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; -import * as bitcoreLibCash from 'bitcore-lib-cash'; +import bitcoreLibCash from 'bitcore-lib-cash'; +import type { + HdKeyParameters, + HdPrivateNode, + HdPrivateNodeInvalid, + HdPrivateNodeKnownParent, + HdPrivateNodeValid, + HdPublicNode, +} from '../lib'; import { crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode, decodeHdKey, @@ -19,19 +25,16 @@ import { encodeHdPrivateKey, encodeHdPublicKey, HdKeyDecodingError, - HdKeyParameters, HdKeyVersion, HdNodeCrackingError, HdNodeDerivationError, - HdPrivateNode, - HdPrivateNodeInvalid, - HdPrivateNodeKnownParent, - HdPrivateNodeValid, - HdPublicNode, hexToBin, - instantiateBIP32Crypto, + ripemd160, + secp256k1, + sha256, + sha512, validateSecp256k1PrivateKey, -} from '../lib'; +} from '../lib.js'; const seed = Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); @@ -59,8 +62,9 @@ const publicKeyLength = 33; const hardenedIndexOffset = 0x80000000; const maximumNonHardenedIndex = hardenedIndexOffset - 1; -test('[crypto] deriveHdPrivateNodeFromSeed', async (t) => { - const crypto = await instantiateBIP32Crypto(); +const crypto = { ripemd160, secp256k1, sha256, sha512 }; + +test('[crypto] deriveHdPrivateNodeFromSeed', (t) => { const valid = { chainCode: hexToBin( '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' @@ -85,40 +89,43 @@ test('[crypto] deriveHdPrivateNodeFromSeed', async (t) => { parentFingerprint: hexToBin('00000000'), valid: false, } as HdPrivateNodeInvalid; - const either = deriveHdPrivateNodeFromSeed(crypto, seed); - const validNode = deriveHdPrivateNodeFromSeed(crypto, seed, true); - const invalidNode = deriveHdPrivateNodeFromSeed(crypto, seed, false); + const either = deriveHdPrivateNodeFromSeed(seed); + const validNode = deriveHdPrivateNodeFromSeed(seed, true); + const invalidNode = deriveHdPrivateNodeFromSeed(seed, false, crypto); t.deepEqual(either, valid as HdPrivateNode); t.deepEqual(validNode, valid); t.deepEqual(invalidNode, invalid); }); -test('[crypto] deriveHdPrivateNodeIdentifier', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const { node } = decodeHdPrivateKey(crypto, xprv) as HdKeyParameters< - HdPrivateNodeValid - >; +test('[crypto] deriveHdPrivateNodeIdentifier', (t) => { + const { node } = decodeHdPrivateKey( + xprv + ) as HdKeyParameters; + t.deepEqual( + deriveHdPrivateNodeIdentifier(node), + hexToBin('15c918d389673c6cd0660050f268a843361e1111') + ); t.deepEqual( - deriveHdPrivateNodeIdentifier(crypto, node), + deriveHdPrivateNodeIdentifier(node, crypto), hexToBin('15c918d389673c6cd0660050f268a843361e1111') ); }); -test('[crypto] deriveHdPublicNodeIdentifier', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const { node } = decodeHdPublicKey(crypto, xpub) as HdKeyParameters< - HdPublicNode - >; +test('[crypto] deriveHdPublicNodeIdentifier', (t) => { + const { node } = decodeHdPublicKey(xpub) as HdKeyParameters; t.deepEqual( - deriveHdPublicNodeIdentifier(crypto, node), + deriveHdPublicNodeIdentifier(node), + hexToBin('15c918d389673c6cd0660050f268a843361e1111') + ); + t.deepEqual( + deriveHdPublicNodeIdentifier(node, crypto), hexToBin('15c918d389673c6cd0660050f268a843361e1111') ); }); -test('[crypto] decodeHdKey', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual(decodeHdKey(crypto, xprv), { +test('[crypto] decodeHdKey', (t) => { + t.deepEqual(decodeHdKey(xprv), { node: { chainCode: hexToBin( '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' @@ -133,7 +140,7 @@ test('[crypto] decodeHdKey', async (t) => { }, version: HdKeyVersion.mainnetPrivateKey, }); - t.deepEqual(decodeHdKey(crypto, xpub), { + t.deepEqual(decodeHdKey(xpub, crypto), { node: { chainCode: hexToBin( '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' @@ -149,28 +156,20 @@ test('[crypto] decodeHdKey', async (t) => { }); }); -test('[crypto] decodeHdKey: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual( - decodeHdKey(crypto, '#badKey'), - HdKeyDecodingError.unknownCharacter - ); - t.deepEqual( - decodeHdKey(crypto, 'xprv1234'), - HdKeyDecodingError.incorrectLength - ); +test('[crypto] decodeHdKey: errors', (t) => { + t.deepEqual(decodeHdKey('#badKey'), HdKeyDecodingError.unknownCharacter); + t.deepEqual(decodeHdKey('xprv1234'), HdKeyDecodingError.incorrectLength); t.deepEqual( decodeHdKey( - crypto, - 'xpub661MyMwAqRbcEngHLkoUWCKMBMGeqdqCGkqtzrHaTZub9ALw2oRfHA6fQP5n5X9VHStaNTBYomkSb8BFhUGavwD3RG1qvMkEKceTavTp2Ta' + 'xpub661MyMwAqRbcEngHLkoUWCKMBMGeqdqCGkqtzrHaTZub9ALw2oRfHA6fQP5n5X9VHStaNTBYomkSb8BFhUGavwD3RG1qvMkEKceTavTp2Ta', + crypto ), HdKeyDecodingError.invalidChecksum ); }); -test('[crypto] decodeHdPrivateKey', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual(decodeHdPrivateKey(crypto, xprv), { +test('[crypto] decodeHdPrivateKey', (t) => { + t.deepEqual(decodeHdPrivateKey(xprv), { network: 'mainnet', node: { chainCode: hexToBin( @@ -185,7 +184,7 @@ test('[crypto] decodeHdPrivateKey', async (t) => { valid: true, }, }); - t.deepEqual(decodeHdPrivateKey(crypto, tprv), { + t.deepEqual(decodeHdPrivateKey(tprv, crypto), { network: 'testnet', node: { chainCode: hexToBin( @@ -202,15 +201,10 @@ test('[crypto] decodeHdPrivateKey', async (t) => { }); }); -test('[crypto] decodeHdPrivateKey: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual( - decodeHdPrivateKey(crypto, xpub), - HdKeyDecodingError.privateKeyExpected - ); +test('[crypto] decodeHdPrivateKey: errors', (t) => { + t.deepEqual(decodeHdPrivateKey(xpub), HdKeyDecodingError.privateKeyExpected); t.deepEqual( decodeHdPrivateKey( - crypto, '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' ), HdKeyDecodingError.unknownVersion @@ -218,28 +212,26 @@ test('[crypto] decodeHdPrivateKey: errors', async (t) => { const xprvWith0FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ6c54tCKNErugtr5mi7oyGaDVrYe4SE5u1GnzYHmjDKuKg4vuNm'; t.deepEqual( - decodeHdPrivateKey(crypto, xprvWith0FilledKey), + decodeHdPrivateKey(xprvWith0FilledKey), HdKeyDecodingError.invalidPrivateNode ); const xprvWith255FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ8YpF7eMDfY8piRngHjovbAzQyAMi94xgeLuEgyfisLHpC7G5ST'; t.deepEqual( - decodeHdPrivateKey(crypto, xprvWith255FilledKey), + decodeHdPrivateKey(xprvWith255FilledKey), HdKeyDecodingError.invalidPrivateNode ); t.deepEqual( decodeHdPrivateKey( - crypto, 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBhegPMjkj1oGSFcmBkMX3xdwcMy6NSgrHvmqJptpUW5xGjg7kifZ' ), HdKeyDecodingError.missingPrivateKeyPaddingByte ); }); -test('[crypto] decodeHdPublicKey', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual(decodeHdPublicKey(crypto, xpub), { +test('[crypto] decodeHdPublicKey', (t) => { + t.deepEqual(decodeHdPublicKey(xpub), { network: 'mainnet', node: { chainCode: hexToBin( @@ -253,7 +245,7 @@ test('[crypto] decodeHdPublicKey', async (t) => { ), }, }); - t.deepEqual(decodeHdPublicKey(crypto, tpub), { + t.deepEqual(decodeHdPublicKey(tpub, crypto), { network: 'testnet', node: { chainCode: hexToBin( @@ -269,25 +261,19 @@ test('[crypto] decodeHdPublicKey', async (t) => { }); }); -test('[crypto] decodeHdPublicKey: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); - t.deepEqual( - decodeHdPublicKey(crypto, xprv), - HdKeyDecodingError.publicKeyExpected - ); +test('[crypto] decodeHdPublicKey: errors', (t) => { + t.deepEqual(decodeHdPublicKey(xprv), HdKeyDecodingError.publicKeyExpected); t.deepEqual( decodeHdPublicKey( - crypto, '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' ), HdKeyDecodingError.unknownVersion ); }); -test('[crypto] encodeHdPrivateKey', async (t) => { - const crypto = await instantiateBIP32Crypto(); +test('[crypto] encodeHdPrivateKey', (t) => { t.deepEqual( - encodeHdPrivateKey(crypto, { + encodeHdPrivateKey({ network: 'mainnet', node: { chainCode: hexToBin( @@ -306,29 +292,31 @@ test('[crypto] encodeHdPrivateKey', async (t) => { ); t.deepEqual( - encodeHdPrivateKey(crypto, { - network: 'testnet', - node: { - chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' - ), - childIndex: 0, - depth: 0, - parentFingerprint: hexToBin('00000000'), - privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' - ), - valid: true, + encodeHdPrivateKey( + { + network: 'testnet', + node: { + chainCode: hexToBin( + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + ), + childIndex: 0, + depth: 0, + parentFingerprint: hexToBin('00000000'), + privateKey: hexToBin( + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + ), + valid: true, + }, }, - }), + crypto + ), tprv ); }); -test('[crypto] encodeHdPublicKey', async (t) => { - const crypto = await instantiateBIP32Crypto(); +test('[crypto] encodeHdPublicKey', (t) => { t.deepEqual( - encodeHdPublicKey(crypto, { + encodeHdPublicKey({ network: 'mainnet', node: { chainCode: hexToBin( @@ -345,32 +333,34 @@ test('[crypto] encodeHdPublicKey', async (t) => { xpub ); t.deepEqual( - encodeHdPublicKey(crypto, { - network: 'testnet', - node: { - chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' - ), - childIndex: 0, - depth: 0, - parentFingerprint: hexToBin('00000000'), - publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' - ), + encodeHdPublicKey( + { + network: 'testnet', + node: { + chainCode: hexToBin( + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + ), + childIndex: 0, + depth: 0, + parentFingerprint: hexToBin('00000000'), + publicKey: hexToBin( + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + ), + }, }, - }), + crypto + ), tpub ); }); -test('[crypto] deriveHdPublicNode', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const privateParams = decodeHdPrivateKey(crypto, xprv); +test('[crypto] deriveHdPublicNode', (t) => { + const privateParams = decodeHdPrivateKey(xprv); if (typeof privateParams === 'string') { t.fail(privateParams); return; } - t.deepEqual(deriveHdPublicNode(crypto, privateParams.node), { + t.deepEqual(deriveHdPublicNode(privateParams.node), { chainCode: hexToBin( '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' ), @@ -383,17 +373,14 @@ test('[crypto] deriveHdPublicNode', async (t) => { }); }); -test('[crypto] deriveHdPrivateNodeChild', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const master = decodeHdPrivateKey(crypto, xprv); +test('[crypto] deriveHdPrivateNodeChild', (t) => { + const master = decodeHdPrivateKey(xprv); const hardenedIndex0Child = decodeHdPrivateKey( - crypto, 'xprv9u4S6TaiPQaF7FS24QFpRP6hjff4jXNwwYTkVNC6f6YzHj2a6G28aRN1D6Az82SxMeBivpVS3gDDXyQiu3RANTqWy34Zxi9JN76zSwkjqPF' ); const index1GrandChild = decodeHdPrivateKey( - crypto, 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' ); @@ -408,12 +395,11 @@ test('[crypto] deriveHdPrivateNodeChild', async (t) => { const hardenedIndex0 = 0x80000000; const result0 = deriveHdPrivateNodeChild( - crypto, master.node, hardenedIndex0 ) as HdPrivateNodeValid; - const result1 = deriveHdPrivateNodeChild(crypto, result0, 1); + const result1 = deriveHdPrivateNodeChild(result0, 1, crypto); t.deepEqual(result0, { ...hardenedIndex0Child.node, @@ -425,159 +411,144 @@ test('[crypto] deriveHdPrivateNodeChild', async (t) => { }); }); -test('[crypto] deriveHdPrivateNodeChild: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const { node } = decodeHdPrivateKey(crypto, xprv) as HdKeyParameters< - HdPrivateNodeValid - >; +test('[crypto] deriveHdPrivateNodeChild: errors', (t) => { + const { node } = decodeHdPrivateKey( + xprv + ) as HdKeyParameters; const max = 0xffffffff; t.deepEqual( - deriveHdPrivateNodeChild(crypto, node, max + 1), + deriveHdPrivateNodeChild(node, max + 1), HdNodeDerivationError.childIndexExceedsMaximum ); }); -test('[crypto] deriveHdPublicNodeChild', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const { node } = decodeHdPrivateKey(crypto, xprv) as HdKeyParameters< - HdPrivateNodeValid - >; +test('[crypto] deriveHdPublicNodeChild', (t) => { + const { node } = decodeHdPrivateKey( + xprv + ) as HdKeyParameters; - const parentPublic = deriveHdPublicNode(crypto, node); + const parentPublic = deriveHdPublicNode(node); const derivationIndex = 0; const child = deriveHdPrivateNodeChild( - crypto, node, derivationIndex ) as HdPrivateNodeKnownParent; - const expectedPublic = deriveHdPublicNode(crypto, child); + const expectedPublic = deriveHdPublicNode(child); t.deepEqual( - deriveHdPublicNodeChild(crypto, parentPublic, derivationIndex), + deriveHdPublicNodeChild(parentPublic, derivationIndex), + expectedPublic + ); + + t.deepEqual( + deriveHdPublicNodeChild(parentPublic, derivationIndex, crypto), expectedPublic ); }); -test('[crypto] deriveHdPublicNodeChild: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); - const { node } = decodeHdPublicKey(crypto, xpub) as HdKeyParameters< - HdPublicNode - >; +test('[crypto] deriveHdPublicNodeChild: errors', (t) => { + const { node } = decodeHdPublicKey(xpub) as HdKeyParameters; const hardened0 = 0x80000000; t.deepEqual( - deriveHdPublicNodeChild(crypto, node, hardened0), + deriveHdPublicNodeChild(node, hardened0), HdNodeDerivationError.hardenedDerivationRequiresPrivateNode ); }); -test('[crypto] deriveHdPath', async (t) => { - const crypto = await instantiateBIP32Crypto(); +test('[crypto] deriveHdPath', (t) => { const { node: privateNode } = decodeHdPrivateKey( - crypto, xprv ) as HdKeyParameters; - const publicNode = deriveHdPublicNode(crypto, privateNode); + const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( - deriveHdPath(crypto, privateNode, 'm') as HdPrivateNodeValid, + deriveHdPath(privateNode, 'm') as HdPrivateNodeValid, privateNode ); t.deepEqual( - deriveHdPath(crypto, publicNode, 'M') as HdPublicNode, + deriveHdPath(publicNode, 'M', crypto) as HdPublicNode, publicNode ); - t.deepEqual(deriveHdPath(crypto, privateNode, "m/0'/1"), { - ...(decodeHdPrivateKey( - crypto, - 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' - ) as HdKeyParameters).node, + t.deepEqual(deriveHdPath(privateNode, "m/0'/1"), { + ...( + decodeHdPrivateKey( + 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' + ) as HdKeyParameters + ).node, parentIdentifier: hexToBin('2f2bc501c943dd7f17904b612c090dd88270cc59'), }); t.deepEqual( - deriveHdPath(crypto, publicNode, 'M/0/1/2/3'), + deriveHdPath(publicNode, 'M/0/1/2/3'), deriveHdPublicNode( - crypto, - deriveHdPath(crypto, privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent + deriveHdPath(privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent ) ); t.deepEqual( - deriveHdPath(crypto, privateNode, "m/0'/1'/2'/3'"), - deriveHdPath( - crypto, - privateNode, - 'm/2147483648/2147483649/2147483650/2147483651' - ) + deriveHdPath(privateNode, "m/0'/1'/2'/3'"), + deriveHdPath(privateNode, 'm/2147483648/2147483649/2147483650/2147483651') ); }); -test('[crypto] deriveHdPath: errors', async (t) => { - const crypto = await instantiateBIP32Crypto(); +test('[crypto] deriveHdPath: errors', (t) => { const { node: privateNode } = decodeHdPrivateKey( - crypto, xprv ) as HdKeyParameters; - const publicNode = deriveHdPublicNode(crypto, privateNode); + const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( - deriveHdPath(crypto, privateNode, 'm/bad/1'), + deriveHdPath(privateNode, 'm/bad/1'), HdNodeDerivationError.invalidDerivationPath ); t.deepEqual( - deriveHdPath(crypto, privateNode, 'M'), + deriveHdPath(privateNode, 'M'), HdNodeDerivationError.invalidPrivateDerivationPrefix ); t.deepEqual( - deriveHdPath(crypto, publicNode, 'm'), + deriveHdPath(publicNode, 'm'), HdNodeDerivationError.invalidPublicDerivationPrefix ); t.deepEqual( - deriveHdPath(crypto, privateNode, 'm/0/4294967296/0'), + deriveHdPath(privateNode, 'm/0/4294967296/0'), HdNodeDerivationError.childIndexExceedsMaximum ); t.deepEqual( - deriveHdPath(crypto, publicNode, "M/0/0'/0"), + deriveHdPath(publicNode, "M/0/0'/0"), HdNodeDerivationError.hardenedDerivationRequiresPrivateNode ); t.deepEqual( - deriveHdPath(crypto, publicNode, 'M/0/2147483648/0'), + deriveHdPath(publicNode, 'M/0/2147483648/0'), HdNodeDerivationError.hardenedDerivationRequiresPrivateNode ); }); -test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', async (t) => { - const crypto = await instantiateBIP32Crypto(); +test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', (t) => { const { node: parentPrivateNode } = decodeHdPrivateKey( - crypto, xprv ) as HdKeyParameters; - const parentPublicNode = deriveHdPublicNode(crypto, parentPrivateNode); + const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPath( - crypto, parentPrivateNode, 'm/1234' ) as HdPrivateNodeKnownParent; const hardenedChildNode = deriveHdPath( - crypto, parentPrivateNode, "m/1234'" ) as HdPrivateNodeKnownParent; - const hardenedChildPublicNode = deriveHdPublicNode(crypto, hardenedChildNode); + const hardenedChildPublicNode = deriveHdPublicNode(hardenedChildNode); const nonHardenedGrandchildNode = deriveHdPath( - crypto, hardenedChildNode, 'm/1234' ) as HdPrivateNodeKnownParent; t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( - crypto, parentPublicNode, nonHardenedChildNode ), @@ -586,16 +557,15 @@ test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', async (t) t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( - crypto, hardenedChildPublicNode, - nonHardenedGrandchildNode + nonHardenedGrandchildNode, + crypto ), hardenedChildNode ); t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( - crypto, parentPublicNode, hardenedChildNode ), @@ -603,77 +573,69 @@ test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', async (t) ); }); -// eslint-disable-next-line complexity -const bip32Vector: Macro<[string, string, string, string]> = async ( - t, - seedHex, - path, - hdPrivateKey, - hdPublicKey - // eslint-disable-next-line max-params -) => { - const crypto = await instantiateBIP32Crypto(); - - const master = deriveHdPrivateNodeFromSeed(crypto, hexToBin(seedHex)); - - if (!master.valid) { - t.log(seedHex, master.invalidPrivateKey); - t.fail('Astronomically rare hash found!'); - return; - } +const bip32Vector = test.macro<[string, string, string, string]>({ + // eslint-disable-next-line complexity, max-params + exec: (t, seedHex, path, hdPrivateKey, hdPublicKey) => { + const master = deriveHdPrivateNodeFromSeed(hexToBin(seedHex)); - const childNode = deriveHdPath(crypto, master, path); + if (!master.valid) { + t.log(seedHex, master.invalidPrivateKey); + t.fail('Astronomically rare hash found!'); + return; + } - if (typeof childNode === 'string') { - t.fail(childNode); - return; - } + const childNode = deriveHdPath(master, path); - const vectorXprv = encodeHdPrivateKey(crypto, { - network: 'mainnet', - node: childNode, - }); - t.deepEqual(vectorXprv, hdPrivateKey); + if (typeof childNode === 'string') { + t.fail(childNode); + return; + } - const decodedPrivate = decodeHdPrivateKey(crypto, hdPrivateKey); - if (typeof decodedPrivate === 'string') { - t.fail(decodedPrivate); - return; - } - t.deepEqual( - childNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPrivate.node.parentFingerprint - ); - t.deepEqual(childNode, { - ...decodedPrivate.node, - ...(path === 'm' ? {} : { parentIdentifier: childNode.parentIdentifier }), - }); + const vectorXprv = encodeHdPrivateKey({ + network: 'mainnet', + node: childNode, + }); + t.deepEqual(vectorXprv, hdPrivateKey); - const decodedPublic = decodeHdPublicKey(crypto, hdPublicKey); - if (typeof decodedPublic === 'string') { - t.fail(decodedPublic); - return; - } - const publicNode = deriveHdPublicNode(crypto, childNode); - t.deepEqual( - publicNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPublic.node.parentFingerprint - ); - t.deepEqual(publicNode, { - ...decodedPublic.node, - ...(path === 'm' ? {} : { parentIdentifier: publicNode.parentIdentifier }), - }); + const decodedPrivate = decodeHdPrivateKey(hdPrivateKey); + if (typeof decodedPrivate === 'string') { + t.fail(decodedPrivate); + return; + } + t.deepEqual( + childNode.parentIdentifier?.slice(0, fingerprintLength), + path === 'm' ? undefined : decodedPrivate.node.parentFingerprint + ); + t.deepEqual(childNode, { + ...decodedPrivate.node, + ...(path === 'm' ? {} : { parentIdentifier: childNode.parentIdentifier }), + }); - const vectorXpub = encodeHdPublicKey(crypto, { - network: 'mainnet', - node: publicNode, - }); - t.deepEqual(vectorXpub, hdPublicKey); -}; + const decodedPublic = decodeHdPublicKey(hdPublicKey); + if (typeof decodedPublic === 'string') { + t.fail(decodedPublic); + return; + } + const publicNode = deriveHdPublicNode(childNode); + t.deepEqual( + publicNode.parentIdentifier?.slice(0, fingerprintLength), + path === 'm' ? undefined : decodedPublic.node.parentFingerprint + ); + t.deepEqual(publicNode, { + ...decodedPublic.node, + ...(path === 'm' + ? {} + : { parentIdentifier: publicNode.parentIdentifier }), + }); -// eslint-disable-next-line functional/immutable-data -bip32Vector.title = (title, _, path) => - `[crypto] BIP32 Vector – ${title ?? ''}: ${path}`; + const vectorXpub = encodeHdPublicKey({ + network: 'mainnet', + node: publicNode, + }); + t.deepEqual(vectorXpub, hdPublicKey); + }, + title: (title, _, path) => `[crypto] BIP32 Vector – ${title ?? ''}: ${path}`, +}); test( '#1.1', @@ -816,16 +778,15 @@ const fcBip32Path = () => testProp( '[fast-check] [crypto] HD key derivation is equivalent to bitcore-lib-cash', [fcBip32Path()], - async (t, path: string) => { - const crypto = await instantiateBIP32Crypto(); - const privateNode = (decodeHdPrivateKey(crypto, xprv) as HdKeyParameters< - HdPrivateNodeValid - >).node; - const node = deriveHdPath(crypto, privateNode, path) as HdPrivateNodeValid; - const publicNode = deriveHdPublicNode(crypto, node); - - const resultPrv = encodeHdPrivateKey(crypto, { network: 'mainnet', node }); - const resultPub = encodeHdPublicKey(crypto, { + (t, path: string) => { + const privateNode = ( + decodeHdPrivateKey(xprv) as HdKeyParameters + ).node; + const node = deriveHdPath(privateNode, path) as HdPrivateNodeValid; + const publicNode = deriveHdPublicNode(node); + + const resultPrv = encodeHdPrivateKey({ network: 'mainnet', node }); + const resultPub = encodeHdPublicKey({ network: 'mainnet', node: publicNode, }); @@ -852,7 +813,7 @@ testProp( fcUint8Array(chainCodeLength, chainCodeLength), fcUint8Array(publicKeyLength, publicKeyLength), ], - async ( + ( t, mainnet: boolean, depth: number, @@ -862,8 +823,7 @@ testProp( publicKey: Uint8Array // eslint-disable-next-line max-params ) => { - const crypto = await instantiateBIP32Crypto(); - const encoded = encodeHdPublicKey(crypto, { + const encoded = encodeHdPublicKey({ network: mainnet ? 'mainnet' : 'testnet', node: { chainCode, @@ -876,8 +836,7 @@ testProp( t.deepEqual( encoded, encodeHdPublicKey( - crypto, - decodeHdPublicKey(crypto, encoded) as HdKeyParameters + decodeHdPublicKey(encoded) as HdKeyParameters ) ); } @@ -893,7 +852,7 @@ testProp( fcUint8Array(chainCodeLength, chainCodeLength), fcUint8Array(privateKeyLength, privateKeyLength), ], - async ( + ( t, mainnet: boolean, depth: number, @@ -907,8 +866,7 @@ testProp( t.pass(); return; } - const crypto = await instantiateBIP32Crypto(); - const encoded = encodeHdPrivateKey(crypto, { + const encoded = encodeHdPrivateKey({ network: mainnet ? 'mainnet' : 'testnet', node: { chainCode, @@ -922,10 +880,7 @@ testProp( t.deepEqual( encoded, encodeHdPrivateKey( - crypto, - decodeHdPrivateKey(crypto, encoded) as HdKeyParameters< - HdPrivateNodeValid - > + decodeHdPrivateKey(encoded) as HdKeyParameters ) ); } @@ -940,7 +895,7 @@ testProp( fcUint8Array(chainCodeLength, chainCodeLength), fcUint8Array(privateKeyLength, privateKeyLength), ], - async ( + ( t, depth: number, childIndexes: number, @@ -949,12 +904,11 @@ testProp( privateKey: Uint8Array // eslint-disable-next-line max-params ) => { - const crypto = await instantiateBIP32Crypto(); if (!validateSecp256k1PrivateKey(privateKey)) { t.pass(); return; } - const parentXprv = encodeHdPrivateKey(crypto, { + const parentXprv = encodeHdPrivateKey({ network: 'mainnet', node: { chainCode, @@ -967,23 +921,21 @@ testProp( }); const { node: parentPrivateNode } = decodeHdPrivateKey( - crypto, parentXprv ) as HdKeyParameters; - const parentPublicNode = deriveHdPublicNode(crypto, parentPrivateNode); + const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPrivateNodeChild( - crypto, parentPrivateNode, childIndexes ) as HdPrivateNodeValid; - const crackedParentNode = crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( - crypto, - parentPublicNode, - nonHardenedChildNode - ) as HdPrivateNodeValid; - const crackedXprv = encodeHdPrivateKey(crypto, { + const crackedParentNode = + crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( + parentPublicNode, + nonHardenedChildNode + ) as HdPrivateNodeValid; + const crackedXprv = encodeHdPrivateKey({ network: 'mainnet', node: crackedParentNode, }); diff --git a/src/lib/key/hd-key.ts b/src/lib/key/hd-key.ts index b29c89f2..589eabd2 100644 --- a/src/lib/key/hd-key.ts +++ b/src/lib/key/hd-key.ts @@ -1,14 +1,10 @@ import { - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha256, - instantiateSha512, - Ripemd160, - Secp256k1, - Sha256, - Sha512, -} from '../crypto/crypto'; -import { hmacSha512 } from '../crypto/hmac'; + ripemd160 as internalRipemd160, + secp256k1 as internalSecp256k1, + sha256 as internalSha256, + sha512 as internalSha512, +} from '../crypto/default-crypto-instances.js'; +import { hmacSha512 } from '../crypto/hmac.js'; import { base58ToBin, BaseConversionError, @@ -17,13 +13,13 @@ import { binToBigIntUint256BE, flattenBinArray, numberToBinUint32BE, -} from '../format/format'; -import { utf8ToBin } from '../format/utf8'; +} from '../format/format.js'; +import type { Ripemd160, Secp256k1, Sha256, Sha512 } from '../lib'; -import { validateSecp256k1PrivateKey } from './key-utils'; +import { validateSecp256k1PrivateKey } from './key-utils.js'; /** - * The networks which can be referenced by an HD public or private key. + * The networks that can be referenced by an HD public or private key. */ export type HdKeyNetwork = 'mainnet' | 'testnet'; @@ -39,7 +35,7 @@ export interface HdKeyParameters< interface HdNodeBase { /** - * 32 bytes of additional entropy which can be used to derive HD child nodes. + * 32 bytes of additional entropy that can be used to derive HD child nodes. */ chainCode: Uint8Array; /** @@ -63,12 +59,12 @@ interface HdNodeBase { /** * The first 4 bytes of the parent node's identifier. This is used to quickly * identify the parent node in data structures, but collisions can occur. To - * resolve collisions, use the full parent identifer. (See - * `deriveHdPublicNodeIdentifier` for details.) + * resolve collisions, use the full parent identifier. (See + * {@link deriveHdPublicNodeIdentifier} for details.) */ parentFingerprint: Uint8Array; /** - * The full identifer of the parent node. This can be used to resolve + * The full identifier of the parent node. This can be used to resolve * collisions where two possible parent nodes share a `parentFingerprint`. * Since the full `parentIdentifier` is not encoded in BIP32 HD keys, it * might be unknown. @@ -83,7 +79,7 @@ interface HdNodeBase { */ export interface HdPrivateNodeValid extends HdNodeBase { /** - * This `HdPrivateNode`'s 32-byte valid Secp256k1 private key. + * This {@link HdPrivateNode}'s 32-byte valid Secp256k1 private key. */ privateKey: Uint8Array; valid: true; @@ -102,11 +98,11 @@ export interface HdPrivateNodeValid extends HdNodeBase { */ export interface HdPrivateNodeInvalid extends HdNodeBase { /** - * The 32-byte derivation result which is not a valid Secp256k1 private key. + * The 32-byte derivation result that is not a valid Secp256k1 private key. * This is almost impossibly rare in a securely-random 32-byte Uint8Array, * with a probability less than 1 in 2^127. * - * See `validateSecp256k1PrivateKey` for details. + * See {@link validateSecp256k1PrivateKey} for details. */ invalidPrivateKey: Uint8Array; valid: false; @@ -114,7 +110,7 @@ export interface HdPrivateNodeInvalid extends HdNodeBase { /** * A valid HD private node for which the parent node is known (and - * `parentIdentifer` is guaranteed to be defined). + * `parentIdentifier` is guaranteed to be defined). */ export interface HdPrivateNodeKnownParent extends HdPrivateNodeValid { parentIdentifier: Uint8Array; @@ -127,7 +123,7 @@ export interface HdPrivateNodeKnownParent extends HdPrivateNodeValid { * Note, HD nodes are network-independent. A network is required only when * encoding the node as an HD key or using a derived public key in an address. */ -export type HdPrivateNode = HdPrivateNodeValid | HdPrivateNodeInvalid; +export type HdPrivateNode = HdPrivateNodeInvalid | HdPrivateNodeValid; /** * A public node in a Hierarchical Deterministic (HD) key tree. @@ -137,13 +133,13 @@ export type HdPrivateNode = HdPrivateNodeValid | HdPrivateNodeInvalid; */ export interface HdPublicNode extends HdNodeBase { /** - * This `HdPublicNode`'s valid 33-byte Secp256k1 compressed public key. + * This {@link HdPublicNode}'s valid 33-byte Secp256k1 compressed public key. */ publicKey: Uint8Array; } /** - * An HD public node for which the parent node is known (and `parentIdentifer` + * An HD public node for which the parent node is known (and `parentIdentifier` * is guaranteed to be defined). */ export interface HdPublicNodeKnownParent extends HdPublicNode { @@ -151,62 +147,52 @@ export interface HdPublicNodeKnownParent extends HdPublicNode { } /** - * Instantiate an object containing WASM implementations of each cryptographic - * algorithm required by BIP32 utilities in this library. - * - * These WASM implementations provide optimal performance across every - * JavaScript runtime, but depending on your application, you may prefer to - * instantiate native implementations such as those provided by Node.js or the - * `crypto.subtle` API (to reduce bundle size) or an external module (for - * synchronous instantiation). + * The HMAC SHA-512 key used by BIP32, "Bitcoin seed" + * (`utf8ToBin('Bitcoin seed')`) */ -export const instantiateBIP32Crypto = async () => { - const [ripemd160, secp256k1, sha256, sha512] = await Promise.all([ - instantiateRipemd160(), - instantiateSecp256k1(), - instantiateSha256(), - instantiateSha512(), - ]); - return { ripemd160, secp256k1, sha256, sha512 }; -}; - -const bip32HmacSha512Key = utf8ToBin('Bitcoin seed'); +const bip32HmacSha512Key = Uint8Array.from([ + // eslint-disable-next-line @typescript-eslint/no-magic-numbers + 66, 105, 116, 99, 111, 105, 110, 32, 115, 101, 101, 100, +]); const halfHmacSha512Length = 32; /** - * Derive an `HdPrivateNode` from the provided seed following the BIP32 + * Derive an {@link HdPrivateNode} from the provided seed following the BIP32 * specification. A seed should include between 16 bytes and 64 bytes of * entropy (recommended: 32 bytes). * - * @param crypto - an implementation of sha512 - * @param seed - the entropy from which to derive the `HdPrivateNode` + * @param seed - the entropy from which to derive the {@link HdPrivateNode} * @param assumeValidity - if set, the derived private key will not be checked * for validity, and will be assumed valid if `true` or invalid if `false` (this * is useful for testing) + * @param crypto - an optional object containing an implementation of sha512 + * to use */ export const deriveHdPrivateNodeFromSeed = < AssumedValidity extends boolean | undefined >( - crypto: { sha512: { hash: Sha512['hash'] } }, seed: Uint8Array, - assumeValidity?: AssumedValidity + assumeValidity?: AssumedValidity, + crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } ) => { - const mac = hmacSha512(crypto.sha512, bip32HmacSha512Key, seed); + const mac = hmacSha512(bip32HmacSha512Key, seed, crypto.sha512); const privateKey = mac.slice(0, halfHmacSha512Length); const chainCode = mac.slice(halfHmacSha512Length); const depth = 0; const childIndex = 0; const parentFingerprint = Uint8Array.from([0, 0, 0, 0]); const valid = assumeValidity ?? validateSecp256k1PrivateKey(privateKey); - return (valid - ? { chainCode, childIndex, depth, parentFingerprint, privateKey, valid } - : { - chainCode, - childIndex, - depth, - invalidPrivateKey: privateKey, - parentFingerprint, - valid, - }) as AssumedValidity extends true + return ( + valid + ? { chainCode, childIndex, depth, parentFingerprint, privateKey, valid } + : { + chainCode, + childIndex, + depth, + invalidPrivateKey: privateKey, + parentFingerprint, + valid, + } + ) as AssumedValidity extends true ? HdPrivateNodeValid : AssumedValidity extends false ? HdPrivateNodeInvalid @@ -214,79 +200,86 @@ export const deriveHdPrivateNodeFromSeed = < }; /** - * Derive the public identifier for a given HD private node. This is used to - * uniquely identify HD nodes in software. The first 4 bytes of this identifier - * are considered its "fingerprint". - * - * @param crypto - implementations of sha256, ripemd160, and secp256k1 - * compressed public key derivation - * @param hdPrivateNode - the HD private node from which to derive the public - * identifier (not require to be valid) + * Derive the public identifier for a given {@link HdPrivateNode}. This is used + * to uniquely identify HD nodes in software. The first 4 bytes of this + * identifier are considered its "fingerprint". + * + * @param hdPrivateNode - the {@link HdPrivateNode} from which to derive the + * public identifier (not require to be valid) + * @param crypto - an optional object containing implementations implementations + * of sha256, ripemd160, and secp256k1 compressed public key derivation to use */ export const deriveHdPrivateNodeIdentifier = ( + hdPrivateNode: HdPrivateNodeValid, crypto: { sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; secp256k1: { derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; }; - }, - hdPrivateNode: HdPrivateNodeValid -) => - crypto.ripemd160.hash( - crypto.sha256.hash( - crypto.secp256k1.derivePublicKeyCompressed(hdPrivateNode.privateKey) - ) + } = { + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + } +) => { + const publicKey = crypto.secp256k1.derivePublicKeyCompressed( + hdPrivateNode.privateKey ); + if (typeof publicKey === 'string') return publicKey; + return crypto.ripemd160.hash(crypto.sha256.hash(publicKey)); +}; /** - * Derive the public identifier for a given `HdPublicNode`. This is used to - * uniquely identify HD nodes in software. The first 4 bytes of this identifier - * are considered its fingerprint. + * Derive the public identifier for a given {@link HdPublicNode}. This is used + * to uniquely identify HD nodes in software. The first 4 bytes of this + * identifier are considered its fingerprint. * - * @param crypto - implementations of sha256 and ripemd160 + * @param node - the {@link HdPublicNode} from which to derive the identifier + * @param crypto - an optional object containing implementations of sha256 and + * ripemd160 to use */ export const deriveHdPublicNodeIdentifier = ( + node: HdPublicNode, crypto: { - sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; - }, - node: HdPublicNode + sha256: { hash: Sha256['hash'] }; + } = { ripemd160: internalRipemd160, sha256: internalSha256 } ) => crypto.ripemd160.hash(crypto.sha256.hash(node.publicKey)); /** - * The 4-byte version indicating the network and type of an `HdPrivateKey` or - * `HdPublicKey`. + * The 4-byte version indicating the network and type of an {@link HdPrivateKey} + * or {@link HdPublicKey}. */ export enum HdKeyVersion { /** - * Version indicating the HD key is an `HdPrivateKey` intended for use on the - * main network. Base58 encoding at the expected length of an HD key results - * in a prefix of `xprv`. + * Version indicating the HD key is an {@link HdPrivateKey} intended for use + * on the main network. Base58 encoding at the expected length of an HD key + * results in a prefix of `xprv`. * * Hex: `0x0488ade4` */ mainnetPrivateKey = 0x0488ade4, /** - * Version indicating the HD key is an `HdPublicKey` intended for use on the - * main network. Base58 encoding at the expected length of an HD key results - * in a prefix of `xpub`. + * Version indicating the HD key is an {@link HdPrivateKey} intended for use + * on the main network. Base58 encoding at the expected length of an HD key + * results in a prefix of `xpub`. * * Hex: `0x0488b21e` */ mainnetPublicKey = 0x0488b21e, /** - * Version indicating the HD key is an `HdPrivateKey` intended for use on the - * test network. Base58 encoding at the expected length of an HD key results - * in a prefix of `tprv`. + * Version indicating the HD key is an {@link HdPrivateKey} intended for use + * on the test network. Base58 encoding at the expected length of an HD key + * results in a prefix of `tprv`. * * Hex: `0x04358394` */ testnetPrivateKey = 0x04358394, /** - * Version indicating the HD key is an `HdPublicKey` intended for use on the - * test network. Base58 encoding at the expected length of an HD key results - * in a prefix of `tpub`. + * Version indicating the HD key is an {@link HdPrivateKey} intended for use + * on the test network. Base58 encoding at the expected length of an HD key + * results in a prefix of `tpub`. * * Hex: `0x043587cf` */ @@ -311,16 +304,17 @@ export enum HdKeyDecodingError { * Decode an HD private key as defined by BIP32, returning a `node` and a * `network`. Decoding errors are returned as strings. * - * If the type of the key is known, use `decodeHdPrivateKey` or - * `decodeHdPublicKey`. + * If the type of the key is known, use {@link decodeHdPrivateKey} or + * {@link decodeHdPublicKey}. * - * @param crypto - an implementation of sha256 * @param hdKey - a BIP32 HD private key or HD public key + * @param crypto - an optional object containing an implementation of sha256 + * to use */ // eslint-disable-next-line complexity export const decodeHdKey = ( - crypto: { sha256: { hash: Sha256['hash'] } }, - hdKey: string + hdKey: string, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { const decoded = base58ToBin(hdKey); if (decoded === BaseConversionError.unknownCharacter) @@ -388,9 +382,7 @@ export const decodeHdKey = ( parentFingerprint, valid: false, } as HdPrivateNodeInvalid), - version: version as - | HdKeyVersion.mainnetPrivateKey - | HdKeyVersion.testnetPrivateKey, + version, }; } @@ -410,26 +402,25 @@ export const decodeHdKey = ( parentFingerprint, publicKey: keyData, } as HdPublicNode, - version: version as - | HdKeyVersion.mainnetPublicKey - | HdKeyVersion.testnetPublicKey, + version, }; }; /** * Decode an HD private key as defined by BIP32. * - * This method is similar to `decodeHdKey` but ensures that the result is a - * valid HD private node. Decoding error messages are returned as strings. + * This method is similar to {@link decodeHdKey} but ensures that the result is + * a valid HD private node. Decoding error messages are returned as strings. * - * @param crypto - an implementation of sha256 * @param hdPrivateKey - a BIP32 HD private key + * @param crypto - an optional object containing an implementation of sha256 + * to use */ export const decodeHdPrivateKey = ( - crypto: { sha256: { hash: Sha256['hash'] } }, - hdPrivateKey: string + hdPrivateKey: string, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { - const decoded = decodeHdKey(crypto, hdPrivateKey); + const decoded = decodeHdKey(hdPrivateKey, crypto); if (typeof decoded === 'string') return decoded; if ('publicKey' in decoded.node) { @@ -456,17 +447,18 @@ export const decodeHdPrivateKey = ( /** * Decode an HD public key as defined by BIP32. * - * This method is similar to `decodeHdKey` but ensures that the result is an - * HD public node. Decoding error messages are returned as strings. + * This method is similar to {@link decodeHdKey} but ensures that the result is + * an HD public node. Decoding error messages are returned as strings. * - * @param crypto - an implementation of sha256 * @param hdPublicKey - a BIP32 HD public key + * @param crypto - an optional object containing an implementation of sha256 + * to use */ export const decodeHdPublicKey = ( - crypto: { sha256: { hash: Sha256['hash'] } }, - hdPublicKey: string + hdPublicKey: string, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { - const decoded = decodeHdKey(crypto, hdPublicKey); + const decoded = decodeHdKey(hdPublicKey, crypto); if (typeof decoded === 'string') return decoded; if (decoded.version === HdKeyVersion.mainnetPublicKey) { @@ -485,15 +477,17 @@ export const decodeHdPublicKey = ( }; /** - * Encode an HD private key (as defined by BIP32) given an HD private node. + * Encode an HD private key (as defined by BIP32) given a valid + * {@link HdPrivateNode} and network. * - * @param crypto - an implementation of sha256 * @param keyParameters - a valid HD private node and the network for which to * encode the key + * @param crypto - an optional object containing an implementation of sha256 + * to use */ export const encodeHdPrivateKey = ( - crypto: { sha256: { hash: Sha256['hash'] } }, - keyParameters: HdKeyParameters + keyParameters: HdKeyParameters, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' @@ -522,13 +516,14 @@ export const encodeHdPrivateKey = ( /** * Encode an HD public key (as defined by BIP32) given an HD public node. * - * @param crypto - an implementation of sha256 * @param keyParameters - an HD public node and the network for which to encode * the key + * @param crypto - an optional object containing an implementation of sha256 + * to use */ export const encodeHdPublicKey = ( - crypto: { sha256: { hash: Sha256['hash'] } }, - keyParameters: HdKeyParameters + keyParameters: HdKeyParameters, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' @@ -559,24 +554,24 @@ export const encodeHdPublicKey = ( * keys still carries risk. Along with allowing an attacker to associate wallet * addresses together (breaking privacy), should an attacker gain knowledge of a * single child private key, **it's possible to derive all parent HD private - * keys**. See `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for + * keys**. See {@link crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode} for * details. * - * @param crypto - an implementation of secp256k1 compressed public key - * derivation (e.g. `instantiateSecp256k1`) * @param node - a valid HD private node + * @param crypto - an optional object containing an implementation of secp256k1 + * compressed public key derivation to use */ export const deriveHdPublicNode = < PrivateNode extends HdPrivateNodeValid = HdPrivateNodeValid >( + node: PrivateNode, crypto: { secp256k1: { derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; }; - }, - node: PrivateNode -) => { - return { + } = { secp256k1: internalSecp256k1 } +) => + ({ chainCode: node.chainCode, childIndex: node.childIndex, depth: node.depth, @@ -587,8 +582,7 @@ export const deriveHdPublicNode = < publicKey: crypto.secp256k1.derivePublicKeyCompressed(node.privateKey), } as PrivateNode extends HdPrivateNodeKnownParent ? HdPublicNodeKnownParent - : HdPublicNode; -}; + : HdPublicNode); /** * An error in the derivation of child HD public or private nodes. @@ -605,28 +599,29 @@ export enum HdNodeDerivationError { /** * Derive a child HD private node from an HD private node. * - * To derive a child HD public node, use `deriveHdPublicNode` on the result of - * this method. If the child uses a non-hardened index, it's also possible to - * use `deriveHdPublicNodeChild`. + * To derive a child HD public node, use {@link deriveHdPublicNode} on the + * result of this method. If the child uses a non-hardened index, it's also + * possible to use {@link deriveHdPublicNodeChild}. * * @privateRemarks - * The `Secp256k1.addTweakPrivateKey` method throws if the tweak is out of range - * or if the resulting private key would be invalid. The procedure to handle - * this error is standardized by BIP32: return the HD node at the next child - * index. (Regardless, this scenario is incredibly unlikely without a weakness - * in HMAC-SHA512.) - * - * @param crypto - implementations of sha256, ripemd160, secp256k1 compressed - * public key derivation, and secp256k1 private key "tweak addition" - * (application of the EC group operation) – these are available via - * `instantiateBIP32Crypto` + * The {@link Secp256k1.addTweakPrivateKey} method throws if the tweak is out of + * range or if the resulting private key would be invalid. The procedure to + * handle this error is standardized by BIP32: return the HD node at the next + * child index. (Regardless, this scenario is incredibly unlikely without a + * weakness in HMAC-SHA512.) + * * @param node - the valid HD private node from which to derive the child node * @param index - the index at which to derive the child node - indexes greater * than or equal to the hardened index offset (`0x80000000`/`2147483648`) are * derived using the "hardened" derivation algorithm + * @param crypto - an optional object containing implementations of sha256, + * ripemd160, secp256k1 compressed public key derivation, and secp256k1 private + * key "tweak addition" (application of the EC group operation) */ // eslint-disable-next-line complexity export const deriveHdPrivateNodeChild = ( + node: HdPrivateNodeValid, + index: number, crypto: { ripemd160: { hash: Ripemd160['hash'] }; secp256k1: { @@ -635,13 +630,16 @@ export const deriveHdPrivateNodeChild = ( }; sha256: { hash: Sha256['hash'] }; sha512: { hash: Sha512['hash'] }; - }, - node: HdPrivateNodeValid, - index: number + } = { + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + sha512: internalSha512, + } ): - | HdPrivateNodeKnownParent | HdNodeDerivationError.childIndexExceedsMaximum - | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm => { + | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm + | HdPrivateNodeKnownParent => { const maximumIndex = 0xffffffff; if (index > maximumIndex) { return HdNodeDerivationError.childIndexExceedsMaximum; @@ -652,7 +650,9 @@ export const deriveHdPrivateNodeChild = ( const keyMaterial = useHardenedAlgorithm ? node.privateKey - : crypto.secp256k1.derivePublicKeyCompressed(node.privateKey); + : (crypto.secp256k1.derivePublicKeyCompressed( + node.privateKey + ) as Uint8Array); const serialization = Uint8Array.from([ ...(useHardenedAlgorithm ? [0x00] : []), @@ -660,34 +660,32 @@ export const deriveHdPrivateNodeChild = ( ...numberToBinUint32BE(index), ]); - const derivation = hmacSha512(crypto.sha512, node.chainCode, serialization); + const derivation = hmacSha512(node.chainCode, serialization, crypto.sha512); const tweakValueLength = 32; const tweakValue = derivation.slice(0, tweakValueLength); const nextChainCode = derivation.slice(tweakValueLength); - // eslint-disable-next-line functional/no-try-statement - try { - const nextPrivateKey = crypto.secp256k1.addTweakPrivateKey( - node.privateKey, - tweakValue - ); - const parentIdentifier = deriveHdPrivateNodeIdentifier(crypto, node); - const parentFingerprintLength = 4; - return { - chainCode: nextChainCode, - childIndex: index, - depth: node.depth + 1, - parentFingerprint: parentIdentifier.slice(0, parentFingerprintLength), - parentIdentifier, - privateKey: nextPrivateKey, - valid: true, - } as HdPrivateNodeKnownParent; - } catch (error) /* istanbul ignore next - testing requires >2^127 brute force */ { + const nextPrivateKey = crypto.secp256k1.addTweakPrivateKey( + node.privateKey, + tweakValue + ); + if (typeof nextPrivateKey === 'string') { if (index === hardenedIndexOffset - 1) { return HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm; } - return deriveHdPrivateNodeChild(crypto, node, index + 1); + return deriveHdPrivateNodeChild(node, index + 1, crypto); } + const parentIdentifier = deriveHdPrivateNodeIdentifier(node, crypto); + const parentFingerprintLength = 4; + return { + chainCode: nextChainCode, + childIndex: index, + depth: node.depth + 1, + parentFingerprint: parentIdentifier.slice(0, parentFingerprintLength), + parentIdentifier, + privateKey: nextPrivateKey, + valid: true, + } as HdPrivateNodeKnownParent; }; /** @@ -701,23 +699,25 @@ export const deriveHdPrivateNodeChild = ( * keys still carries risk. Along with allowing an attacker to associate wallet * addresses together (breaking privacy), should an attacker gain knowledge of a * single child private key, **it's possible to derive all parent HD private - * keys**. See `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for - * details. + * keys**. See {@link crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode} + * for details. * * @privateRemarks - * The `Secp256k1.addTweakPublicKeyCompressed` method throws if the tweak is out - * of range or if the resulting public key would be invalid. The procedure to - * handle this error is standardized by BIP32: return the HD node at the next - * child index. (Regardless, this scenario is incredibly unlikely without a - * weakness in HMAC-SHA512.) + * The {@link secp256k1.addTweakPublicKeyCompressed} method returns an error as + * a string if the tweak is out of range or if the resulting public key would be + * invalid. The procedure to handle this error is standardized by BIP32: return + * the HD node at the next child index. (Regardless, this scenario is incredibly + * unlikely without a weakness in HMAC-SHA512.) * - * @param crypto - implementations of sha256, sha512, ripemd160, and secp256k1 - * compressed public key "tweak addition" (application of the EC group - * operation) – these are available via `instantiateBIP32Crypto` * @param node - the HD public node from which to derive the child public node * @param index - the index at which to derive the child node + * @param crypto - an optional object containing implementations of sha256, + * sha512, ripemd160, and secp256k1 compressed public key "tweak addition" + * (application of the EC group operation) */ export const deriveHdPublicNodeChild = ( + node: HdPublicNode, + index: number, crypto: { ripemd160: { hash: Ripemd160['hash'] }; secp256k1: { @@ -725,13 +725,16 @@ export const deriveHdPublicNodeChild = ( }; sha256: { hash: Sha256['hash'] }; sha512: { hash: Sha512['hash'] }; - }, - node: HdPublicNode, - index: number + } = { + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + sha512: internalSha512, + } ): - | HdPublicNodeKnownParent | HdNodeDerivationError.hardenedDerivationRequiresPrivateNode - | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm => { + | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm + | HdPublicNodeKnownParent => { const hardenedIndexOffset = 0x80000000; if (index >= hardenedIndexOffset) { return HdNodeDerivationError.hardenedDerivationRequiresPrivateNode; @@ -742,48 +745,46 @@ export const deriveHdPublicNodeChild = ( ...numberToBinUint32BE(index), ]); - const derivation = hmacSha512(crypto.sha512, node.chainCode, serialization); + const derivation = hmacSha512(node.chainCode, serialization, crypto.sha512); const tweakValueLength = 32; const tweakValue = derivation.slice(0, tweakValueLength); const nextChainCode = derivation.slice(tweakValueLength); - // eslint-disable-next-line functional/no-try-statement - try { - const nextPublicKey = crypto.secp256k1.addTweakPublicKeyCompressed( - node.publicKey, - tweakValue - ); - const parentIdentifier = deriveHdPublicNodeIdentifier(crypto, node); - const parentFingerprintLength = 4; - return { - chainCode: nextChainCode, - childIndex: index, - depth: node.depth + 1, - parentFingerprint: parentIdentifier.slice(0, parentFingerprintLength), - parentIdentifier, - publicKey: nextPublicKey, - } as HdPublicNodeKnownParent; - } catch (error) /* istanbul ignore next - testing requires >2^127 brute force */ { + const nextPublicKey = crypto.secp256k1.addTweakPublicKeyCompressed( + node.publicKey, + tweakValue + ); + if (typeof nextPublicKey === 'string') { if (index === hardenedIndexOffset - 1) { return HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm; } - return deriveHdPublicNodeChild(crypto, node, index + 1); + return deriveHdPublicNodeChild(node, index + 1, crypto); } + const parentIdentifier = deriveHdPublicNodeIdentifier(node, crypto); + const parentFingerprintLength = 4; + return { + chainCode: nextChainCode, + childIndex: index, + depth: node.depth + 1, + parentFingerprint: parentIdentifier.slice(0, parentFingerprintLength), + parentIdentifier, + publicKey: nextPublicKey, + } as HdPublicNodeKnownParent; }; type PrivateResults = NodeType extends HdPrivateNodeKnownParent ? HdPrivateNodeKnownParent : - | HdPrivateNodeValid | HdNodeDerivationError.childIndexExceedsMaximum - | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm; + | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm + | HdPrivateNodeValid; type PublicResults = NodeType extends HdPublicNodeKnownParent ? HdPublicNodeKnownParent : - | HdPublicNode | HdNodeDerivationError.hardenedDerivationRequiresPrivateNode - | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm; + | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm + | HdPublicNode; /** * This type is a little complex because resulting HD nodes may not have a known @@ -820,23 +821,25 @@ type ReductionResults = NodeType extends HdPrivateNodeValid * * `derivePublic(derivePublic(derivePublic(node, 3), 4), 5)` * - * Because hardened derivation requires a private node, paths which specify + * Because hardened derivation requires a private node, paths that specify * public derivation (`M`) using hardened derivation (`'`) will return an error. - * To derive the public node associated with a child private node which requires + * To derive the public node associated with a child private node that requires * hardened derivation, begin with private derivation, then provide the result * to `deriveHdPublicNode`. * - * @param crypto - implementations of sha256, sha512, ripemd160, and secp256k1 - * derivation functions – these are available via `instantiateBIP32Crypto` * @param node - the HD node from which to begin the derivation (for paths - * beginning with `m`, an `HdPrivateNodeValid`; for paths beginning with `M`, an - * `HdPublicNode`) + * beginning with `m`, an {@link HdPrivateNodeValid}; for paths beginning with + * `M`, an {@link HdPublicNode}) * @param path - the BIP32 derivation path, e.g. `m/0/1'/2` or `M/3/4/5` + * @param crypto - an optional object containing implementations of sha256, + * sha512, ripemd160, and secp256k1 derivation functions */ // eslint-disable-next-line complexity export const deriveHdPath = < NodeType extends HdPrivateNodeValid | HdPublicNode >( + node: NodeType, + path: string, crypto: { ripemd160: { hash: Ripemd160['hash'] }; secp256k1: { @@ -846,9 +849,12 @@ export const deriveHdPath = < }; sha256: { hash: Sha256['hash'] }; sha512: { hash: Sha512['hash'] }; - }, - node: NodeType, - path: string + } = { + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha256: internalSha256, + sha512: internalSha512, + } ): | HdNodeDerivationError.invalidDerivationPath | HdNodeDerivationError.invalidPrivateDerivationPrefix @@ -881,21 +887,23 @@ export const deriveHdPath = < : parseInt(index, base) ); - return (isPrivateDerivation - ? indexes.reduce( - (result, nextIndex) => - typeof result === 'string' - ? result - : deriveHdPrivateNodeChild(crypto, result, nextIndex), - node as PrivateResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter - ) - : indexes.reduce( - (result, nextIndex) => - typeof result === 'string' - ? result - : deriveHdPublicNodeChild(crypto, result, nextIndex), - node as PublicResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter - )) as ReductionResults; + return ( + isPrivateDerivation + ? indexes.reduce( + (result, nextIndex) => + typeof result === 'string' + ? result + : deriveHdPrivateNodeChild(result, nextIndex, crypto), + node as PrivateResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + ) + : indexes.reduce( + (result, nextIndex) => + typeof result === 'string' + ? result + : deriveHdPublicNodeChild(result, nextIndex, crypto), + node as PublicResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + ) + ) as ReductionResults; }; export enum HdNodeCrackingError { @@ -922,18 +930,18 @@ export enum HdNodeCrackingError { * between support for HD public node derivation or support for sharing child * private nodes. * - * @param crypto - an implementation of sha512 * @param parentPublicNode - the parent HD public node for which to derive a * private node * @param childPrivateNode - any non-hardened child private node of the parent * node (only the `privateKey` and the `childIndex` are required) + * * @param crypto - an optional object containing an implementation of sha512 */ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < PublicNode extends HdPublicNode = HdPublicNode >( - crypto: { sha512: { hash: Sha512['hash'] } }, parentPublicNode: PublicNode, - childPrivateNode: { childIndex: number; privateKey: Uint8Array } + childPrivateNode: { childIndex: number; privateKey: Uint8Array }, + crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } ) => { const hardenedIndexOffset = 0x80000000; if (childPrivateNode.childIndex >= hardenedIndexOffset) { @@ -945,9 +953,9 @@ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < ]); const derivation = hmacSha512( - crypto.sha512, parentPublicNode.chainCode, - serialization + serialization, + crypto.sha512 ); const tweakValueLength = 32; const tweakValue = binToBigIntUint256BE( diff --git a/src/lib/key/key-utils.spec.ts b/src/lib/key/key-utils.spec.ts index 21b90aef..75af9d35 100644 --- a/src/lib/key/key-utils.spec.ts +++ b/src/lib/key/key-utils.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable functional/no-expression-statement */ import { randomBytes } from 'crypto'; import test from 'ava'; @@ -7,17 +6,15 @@ import { fc, testProp } from 'ava-fast-check'; import { generatePrivateKey, hexToBin, - instantiateSecp256k1, + secp256k1, validateSecp256k1PrivateKey, -} from '../lib'; +} from '../lib.js'; const privateKeyLength = 32; const maximumUint8Value = 255; const secureRandom = () => randomBytes(privateKeyLength); -const secp256k1Promise = instantiateSecp256k1(); - test('validateSecp256k1PrivateKey', (t) => { t.false(validateSecp256k1PrivateKey(hexToBin(''))); t.false(validateSecp256k1PrivateKey(hexToBin('00'))); @@ -59,7 +56,7 @@ test('validateSecp256k1PrivateKey', (t) => { }); const secp256k1OrderNFFBytes = 15; -// eslint-disable-next-line functional/immutable-data + const almostInvalid = Array(secp256k1OrderNFFBytes).fill( maximumUint8Value ) as number[]; @@ -72,8 +69,7 @@ testProp( .array(fc.integer(0, maximumUint8Value), theRest, theRest) .map((random) => Uint8Array.from([...almostInvalid, ...random])), ], - async (t, input) => { - const secp256k1 = await secp256k1Promise; + (t, input) => { t.deepEqual( validateSecp256k1PrivateKey(input), secp256k1.validatePrivateKey(input) @@ -81,8 +77,7 @@ testProp( } ); -test('generatePrivateKey: works', async (t) => { - const secp256k1 = await secp256k1Promise; +test('generatePrivateKey: works', (t) => { const key = generatePrivateKey(secureRandom); t.true(secp256k1.validatePrivateKey(key)); }); @@ -91,15 +86,13 @@ test('generatePrivateKey: tries until success', (t) => { // eslint-disable-next-line functional/no-let let calls = 0; const entropy = [ - // eslint-disable-next-line functional/immutable-data Uint8Array.from(Array(privateKeyLength).fill(maximumUint8Value)), - // eslint-disable-next-line functional/immutable-data Uint8Array.from(Array(privateKeyLength).fill(1)), ]; const mockEntropy = () => { - // eslint-disable-next-line no-plusplus - calls++; - return entropy[calls]; + calls += 1; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return entropy[calls]!; }; const key = generatePrivateKey(mockEntropy); diff --git a/src/lib/key/key-utils.ts b/src/lib/key/key-utils.ts index 62c5fcca..c1c640df 100644 --- a/src/lib/key/key-utils.ts +++ b/src/lib/key/key-utils.ts @@ -5,12 +5,11 @@ * Private keys are 256-bit numbers encoded as a 32-byte, big-endian Uint8Array. * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, * any 256-bit number greater than `0x01` and less than - * `0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140` + * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` * is a valid private key. This range is part of the definition of the * secp256k1 elliptic curve parameters. * - * This method does not require the `Secp256k1` WASM implementation (available - * via `instantiateSecp256k1`). + * This method does not require a `Secp256k1` implementation. */ export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { const privateKeyLength = 32; @@ -34,7 +33,8 @@ export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { if ( firstDifference === -1 || - privateKey[firstDifference] < maximumSecp256k1PrivateKey[firstDifference] + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + privateKey[firstDifference]! < maximumSecp256k1PrivateKey[firstDifference]! ) { return true; } @@ -63,8 +63,7 @@ export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { * ); * ``` * - * @param secp256k1 - an implementation of Secp256k1 - * @param secureRandom - a method which returns a securely-random 32-byte + * @param secureRandom - a method that returns a securely-random 32-byte * Uint8Array */ export const generatePrivateKey = (secureRandom: () => Uint8Array) => { diff --git a/src/lib/key/key.ts b/src/lib/key/key.ts index a01f36a4..76da6b3d 100644 --- a/src/lib/key/key.ts +++ b/src/lib/key/key.ts @@ -1,3 +1,3 @@ -export * from './hd-key'; -export * from './key-utils'; -export * from './wallet-import-format'; +export * from './hd-key.js'; +export * from './key-utils.js'; +export * from './wallet-import-format.js'; diff --git a/src/lib/key/wallet-import-format.spec.ts b/src/lib/key/wallet-import-format.spec.ts index a1a8dc08..9366c714 100644 --- a/src/lib/key/wallet-import-format.spec.ts +++ b/src/lib/key/wallet-import-format.spec.ts @@ -1,48 +1,42 @@ -/* eslint-disable functional/no-expression-statement */ -import test, { Macro } from 'ava'; +import test from 'ava'; +import type { WalletImportFormatType } from '../lib'; import { Base58AddressError, decodePrivateKeyWif, encodePrivateKeyWif, hexToBin, - instantiateSha256, - WalletImportFormatType, -} from '../lib'; + sha256 as internalSha256, +} from '../lib.js'; -const sha256Promise = instantiateSha256(); - -test('decodePrivateKeyWif: pass through errors', async (t) => { - const sha256 = await sha256Promise; +test('decodePrivateKeyWif: pass through errors', (t) => { t.deepEqual( - decodePrivateKeyWif(sha256, 'not a key'), + decodePrivateKeyWif('not a key'), Base58AddressError.unknownCharacter ); }); -const wifVectors: Macro<[WalletImportFormatType, string, string]> = async ( - t, - type, - wif, - key +const wifVectors = test.macro<[WalletImportFormatType, string, string]>({ // eslint-disable-next-line max-params -) => { - const sha256 = await sha256Promise; - - t.deepEqual(encodePrivateKeyWif(sha256, hexToBin(key), type), wif); - t.deepEqual(decodePrivateKeyWif(sha256, wif), { - privateKey: hexToBin(key), - type, - }); -}; + exec: (t, type, wif, key) => { + t.deepEqual(encodePrivateKeyWif(hexToBin(key), type), wif); + t.deepEqual(decodePrivateKeyWif(wif), { + privateKey: hexToBin(key), + type, + }); + t.deepEqual(encodePrivateKeyWif(hexToBin(key), type, internalSha256), wif); + t.deepEqual(decodePrivateKeyWif(wif, internalSha256), { + privateKey: hexToBin(key), + type, + }); + }, + title: (_, type, base58) => + `encodePrivateKeyWif <-> decodePrivateKeyWif ${type} - ${base58.slice( + 0, -// eslint-disable-next-line functional/immutable-data -wifVectors.title = (_, type, base58) => - `encodePrivateKeyWif <-> decodePrivateKeyWif ${type} - ${base58.slice( - 0, - // eslint-disable-next-line @typescript-eslint/no-magic-numbers - 6 - )}...`; + 6 + )}...`, +}); test( wifVectors, @@ -67,14 +61,14 @@ test( test( wifVectors, - 'mainnet-uncompressed', + 'mainnetUncompressed', '5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr', 'eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19' ); test( wifVectors, - 'testnet-uncompressed', + 'testnetUncompressed', '9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko', '36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2' ); diff --git a/src/lib/key/wallet-import-format.ts b/src/lib/key/wallet-import-format.ts index 8f955328..622fdfe9 100644 --- a/src/lib/key/wallet-import-format.ts +++ b/src/lib/key/wallet-import-format.ts @@ -2,8 +2,9 @@ import { Base58AddressFormatVersion, decodeBase58AddressFormat, encodeBase58AddressFormat, -} from '../address/address'; -import { Sha256 } from '../crypto/crypto'; +} from '../address/address.js'; +import { sha256 as internalSha256 } from '../crypto/default-crypto-instances.js'; +import type { Sha256 } from '../lib'; export enum WalletImportFormatError { incorrectLength = 'The WIF private key payload is not the correct length.', @@ -13,7 +14,7 @@ export enum WalletImportFormatError { * The network and address format in which a WIF-encoded private key is expected * to be used. * - * WIF-encoding is generally used to serialize private keys for Pay to Public + * WIF-encoding is generally used to encode private keys for Pay to Public * Key (P2PKH) addresses – each WIF-encoded private key specifies the * compression of the public key to use in the P2PKH address: * @@ -26,68 +27,66 @@ export enum WalletImportFormatError { */ export type WalletImportFormatType = | 'mainnet' + | 'mainnetUncompressed' | 'testnet' - | 'mainnet-uncompressed' - | 'testnet-uncompressed'; + | 'testnetUncompressed'; /** * Encode a private key using Wallet Import Format (WIF). * * WIF encodes the 32-byte private key, a 4-byte checksum, and a `type` * indicating the intended usage for the private key. See - * `WalletImportFormatType` for details. + * {@link WalletImportFormatType} for details. * * @remarks * WIF-encoding uses the Base58Address format with version - * `Base58AddressFormatVersion.wif` (`128`/`0x80`) or - * `Base58AddressFormatVersion.wifTestnet` (`239`/`0xef`), respectively. + * {@link Base58AddressFormatVersion.wif} (`128`/`0x80`) or + * {@link Base58AddressFormatVersion.wifTestnet} (`239`/`0xef`), respectively. * * To indicate that the private key is intended for use in a P2PKH address using * the compressed form of its derived public key, a `0x01` is appended to the * payload prior to encoding. For the uncompressed construction, the extra byte * is omitted. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) * @param privateKey - a 32-byte Secp256k1 ECDSA private key * @param type - the intended usage of the private key (e.g. `mainnet` or * `testnet`) + * @param sha256 - an implementation of sha256 */ export const encodePrivateKeyWif = ( - sha256: { hash: Sha256['hash'] }, privateKey: Uint8Array, - type: WalletImportFormatType + type: WalletImportFormatType, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { const compressedByte = 0x01; - const mainnet = type === 'mainnet' || type === 'mainnet-uncompressed'; + const mainnet = type === 'mainnet' || type === 'mainnetUncompressed'; const compressed = type === 'mainnet' || type === 'testnet'; const payload = compressed ? Uint8Array.from([...privateKey, compressedByte]) : privateKey; return encodeBase58AddressFormat( - sha256, mainnet ? Base58AddressFormatVersion.wif : Base58AddressFormatVersion.wifTestnet, - payload + payload, + sha256 ); }; /** * Decode a private key using Wallet Import Format (WIF). See - * `encodePrivateKeyWif` for details. + * {@link encodePrivateKeyWif} for details. * - * @param sha256 - an implementation of sha256 (a universal implementation is - * available via `instantiateSha256`) * @param wifKey - the private key to decode (in Wallet Import Format) + * @param sha256 - an implementation of sha256 */ // eslint-disable-next-line complexity export const decodePrivateKeyWif = ( - sha256: { hash: Sha256['hash'] }, - wifKey: string + wifKey: string, + sha256: { hash: Sha256['hash'] } = internalSha256 ) => { const compressedPayloadLength = 33; - const decoded = decodeBase58AddressFormat(sha256, wifKey); + const decoded = decodeBase58AddressFormat(wifKey, sha256); if (typeof decoded === 'string') return decoded; const mainnet = decoded.version === Base58AddressFormatVersion.wif; const compressed = decoded.payload.length === compressedPayloadLength; @@ -98,10 +97,10 @@ export const decodePrivateKeyWif = ( const type: WalletImportFormatType = mainnet ? compressed ? 'mainnet' - : 'mainnet-uncompressed' + : 'mainnetUncompressed' : compressed ? 'testnet' - : 'testnet-uncompressed'; + : 'testnetUncompressed'; return { privateKey, type }; }; diff --git a/src/lib/template/language/compile.spec.ts b/src/lib/language/compile.spec.ts similarity index 97% rename from src/lib/template/language/compile.spec.ts rename to src/lib/language/compile.spec.ts index efbf70e8..ee8f40cd 100644 --- a/src/lib/template/language/compile.spec.ts +++ b/src/lib/language/compile.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers, max-lines */ +/* eslint-disable max-lines */ import test from 'ava'; import { @@ -8,7 +8,7 @@ import { describeExpectedInput, hexToBin, stringifyTestVector, -} from '../../lib'; +} from '../lib.js'; test('compileScript: unprovided ID', (t) => { t.deepEqual(compileScript('test', {}, { scripts: { typo: '1' } }), { @@ -16,7 +16,7 @@ test('compileScript: unprovided ID', (t) => { errors: [ { error: - 'No script with an ID of "test" was provided in the compilation environment.', + 'No script with an ID of "test" was provided in the compiler configuration.', range: { endColumn: 0, endLineNumber: 0, @@ -139,8 +139,8 @@ test('compileScript: empty string', (t) => { test('compileScriptContents: empty string', (t) => { t.deepEqual( compileScriptContents({ + configuration: { scripts: {} }, data: {}, - environment: { scripts: {} }, script: '', }), { @@ -826,9 +826,9 @@ test('compileScript: OP_1 OP_2 OP_ADD', (t) => { {}, { opcodes: { - OP_1: Uint8Array.of(0x51), // eslint-disable-line @typescript-eslint/naming-convention - OP_2: Uint8Array.of(0x52), // eslint-disable-line @typescript-eslint/naming-convention - OP_ADD: Uint8Array.of(0x93), // eslint-disable-line @typescript-eslint/naming-convention + OP_1: Uint8Array.of(0x51), + OP_2: Uint8Array.of(0x52), + OP_ADD: Uint8Array.of(0x93), }, scripts: { t: 'OP_1 OP_2 OP_ADD' }, } @@ -980,8 +980,8 @@ test('compileScript: variable and script inclusion', (t) => { }, { opcodes: { - OP_1: Uint8Array.of(0x51), // eslint-disable-line @typescript-eslint/naming-convention - OP_ADD: Uint8Array.of(0x93), // eslint-disable-line @typescript-eslint/naming-convention + OP_1: Uint8Array.of(0x51), + OP_ADD: Uint8Array.of(0x93), }, operations: { addressData: compilerOperationAddressData, diff --git a/src/lib/language/compile.ts b/src/lib/language/compile.ts new file mode 100644 index 00000000..c296284d --- /dev/null +++ b/src/lib/language/compile.ts @@ -0,0 +1,183 @@ +import type { + AuthenticationProgramStateControlStack, + AuthenticationProgramStateMinimum, + AuthenticationProgramStateStack, + CompilationContextBCH, + CompilationContextCommon, + CompilationData, + CompilationResult, + CompilationResultSuccess, + CompilerConfiguration, +} from '../lib'; + +import { compileScriptRaw, createEmptyRange } from './resolve.js'; + +/** + * Parse, resolve, and reduce the selected script using the provided `data` and + * `configuration`. + * + * Note, locktime validation only occurs if `compilationContext` is provided in + * the configuration. + */ +// eslint-disable-next-line complexity +export const compileScript = < + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack, + CompilationContext extends CompilationContextCommon = CompilationContextBCH +>( + scriptId: string, + data: CompilationData, + configuration: CompilerConfiguration +): CompilationResult => { + const locktimeDisablingSequenceNumber = 0xffffffff; + const lockTimeTypeBecomesTimestamp = 500000000; + if (data.compilationContext?.transaction.locktime !== undefined) { + if ( + configuration.unlockingScriptTimeLockTypes?.[scriptId] === 'height' && + data.compilationContext.transaction.locktime >= + lockTimeTypeBecomesTimestamp + ) { + return { + errorType: 'parse', + errors: [ + { + error: `The script "${scriptId}" requires a height-based locktime (less than 500,000,000), but this transaction uses a timestamp-based locktime ("${data.compilationContext.transaction.locktime}").`, + range: createEmptyRange(), + }, + ], + success: false, + }; + } + if ( + configuration.unlockingScriptTimeLockTypes?.[scriptId] === 'timestamp' && + data.compilationContext.transaction.locktime < + lockTimeTypeBecomesTimestamp + ) { + return { + errorType: 'parse', + errors: [ + { + error: `The script "${scriptId}" requires a timestamp-based locktime (greater than or equal to 500,000,000), but this transaction uses a height-based locktime ("${data.compilationContext.transaction.locktime}").`, + range: createEmptyRange(), + }, + ], + success: false, + }; + } + } + + if ( + data.compilationContext?.transaction.inputs[ + data.compilationContext.inputIndex + ]?.sequenceNumber !== undefined && + configuration.unlockingScriptTimeLockTypes?.[scriptId] !== undefined && + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data.compilationContext.transaction.inputs[ + data.compilationContext.inputIndex + ]!.sequenceNumber === locktimeDisablingSequenceNumber + ) { + return { + errorType: 'parse', + errors: [ + { + error: `The script "${scriptId}" requires a locktime, but this input's sequence number is set to disable transaction locktime (0xffffffff). This will cause the OP_CHECKLOCKTIMEVERIFY operation to error when the transaction is verified. To be valid, this input must use a sequence number that does not disable locktime.`, + range: createEmptyRange(), + }, + ], + success: false, + }; + } + + const rawResult = compileScriptRaw({ + configuration, + data, + scriptId, + }); + + if (!rawResult.success) { + return rawResult; + } + + const unlocks = configuration.unlockingScripts?.[scriptId]; + const unlockingScriptType = + unlocks === undefined + ? undefined + : configuration.lockingScriptTypes?.[unlocks]; + const isP2sh20UnlockingScript = unlockingScriptType === 'p2sh20'; + + const lockingScriptType = configuration.lockingScriptTypes?.[scriptId]; + const isP2sh20LockingScript = lockingScriptType === 'p2sh20'; + + if (isP2sh20LockingScript) { + const transformedResult = compileScriptRaw< + ProgramState, + CompilationContext + >({ + configuration: { + ...configuration, + scripts: { + p2sh20Locking: + 'OP_HASH160 <$( OP_HASH160)> OP_EQUAL', + }, + variables: { lockingBytecode: { type: 'AddressData' } }, + }, + data: { bytecode: { lockingBytecode: rawResult.bytecode } }, + scriptId: 'p2sh20Locking', + }); + + if (!transformedResult.success) { + return transformedResult; + } + return { + ...rawResult, + bytecode: transformedResult.bytecode, + transformed: 'p2sh20-locking', + }; + } + + if (isP2sh20UnlockingScript) { + const lockingBytecodeResult = compileScriptRaw< + ProgramState, + CompilationContext + >({ + configuration, + data, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + scriptId: unlocks!, + }); + if (!lockingBytecodeResult.success) { + return lockingBytecodeResult; + } + const transformedResult = compileScriptRaw< + ProgramState, + CompilationContext + >({ + configuration: { + ...configuration, + scripts: { p2sh20Unlocking: 'unlockingBytecode ' }, + variables: { + lockingBytecode: { type: 'AddressData' }, + unlockingBytecode: { type: 'AddressData' }, + }, + }, + data: { + bytecode: { + lockingBytecode: lockingBytecodeResult.bytecode, + unlockingBytecode: rawResult.bytecode, + }, + }, + scriptId: 'p2sh20Unlocking', + }) as CompilationResultSuccess; + + return { + ...rawResult, + bytecode: transformedResult.bytecode, + transformed: 'p2sh20-unlocking', + }; + } + + return rawResult; +}; diff --git a/src/lib/template/language/language-types.ts b/src/lib/language/language-types.ts similarity index 73% rename from src/lib/template/language/language-types.ts rename to src/lib/language/language-types.ts index 78e1d222..e5c01c8c 100644 --- a/src/lib/template/language/language-types.ts +++ b/src/lib/language/language-types.ts @@ -1,8 +1,8 @@ -import { AuthenticationInstruction } from '../../vm/instruction-sets/instruction-sets-types'; -import { +import type { + AuthenticationInstruction, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, -} from '../../vm/vm-types'; +} from '../lib'; export interface Range { endColumn: number; @@ -23,37 +23,37 @@ export interface MarkedNode { } type StringSegmentType = - | 'Comment' - | 'Identifier' - | 'UTF8Literal' | 'BigIntLiteral' | 'BinaryLiteral' - | 'HexLiteral'; + | 'Comment' + | 'HexLiteral' + | 'Identifier' + | 'UTF8Literal'; -type RecursiveSegmentType = 'Push' | 'Evaluation'; +type RecursiveSegmentType = 'Evaluation' | 'Push'; -interface BitauthTemplatingLanguageSegment extends MarkedNode { +interface CashAssemblyLanguageSegment extends MarkedNode { name: string; } -interface BtlStringSegment extends BitauthTemplatingLanguageSegment { +interface CashAssemblyStringSegment extends CashAssemblyLanguageSegment { name: StringSegmentType; value: string; } -interface BtlRecursiveSegment extends BitauthTemplatingLanguageSegment { +interface CashAssemblyRecursiveSegment extends CashAssemblyLanguageSegment { name: RecursiveSegmentType; - value: BtlScriptSegment; + value: CashAssemblyScriptSegment; } -export interface BtlScriptSegment extends BitauthTemplatingLanguageSegment { +export interface CashAssemblyScriptSegment extends CashAssemblyLanguageSegment { name: 'Script'; - value: (BtlRecursiveSegment | BtlStringSegment)[]; + value: (CashAssemblyRecursiveSegment | CashAssemblyStringSegment)[]; } export type ParseResult = | { expected: string[]; index: SourcePosition; status: false } - | { status: true; value: BtlScriptSegment }; + | { status: true; value: CashAssemblyScriptSegment }; interface ResolvedSegmentBase { range: Range; @@ -78,7 +78,7 @@ export interface ResolvedSegmentVariableBytecode value: Uint8Array; /** * The full identifier (including any compilation operations) of the variable - * which resolved to this `value`, e.g. `my_key.signature.all_outputs` or + * that resolved to this `value`, e.g. `my_key.signature.all_outputs` or * `my_key.public_key`. */ variable: string; @@ -86,11 +86,12 @@ export interface ResolvedSegmentVariableBytecode export interface ResolvedSegmentScriptBytecode extends ResolvedSegmentBase { /** - * The full identifier of the script which resolved to this `value`. + * The full identifier of the script that resolved to this `value`. */ script: string; /** - * The source `ResolvedScript` which was compiled to produce this `value`. + * The source {@link ResolvedScript} that was compiled to produce + * this `value`. */ source: ResolvedScript; type: 'bytecode'; @@ -149,11 +150,11 @@ export interface ResolvedSegmentError extends ResolvedSegmentBase { } export type ResolvedSegment = - | ResolvedSegmentPush - | ResolvedSegmentEvaluation | ResolvedSegmentBytecode | ResolvedSegmentComment - | ResolvedSegmentError; + | ResolvedSegmentError + | ResolvedSegmentEvaluation + | ResolvedSegmentPush; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface ResolvedScript extends Array {} @@ -172,9 +173,10 @@ export enum IdentifierResolutionErrorType { export interface ResolutionDebug { /** - * An additional, complex property which may be returned by custom + * An additional, complex property that may be returned by custom * compiler operations. For use in extending the compiler to support - * additional return information like `CompilerOperationSuccessSignature`. + * additional return information like + * {@link CompilerOperationSuccessSignature}. */ debug?: unknown; } @@ -183,57 +185,38 @@ export interface ResolutionSignature { signature?: | { /** - * The transaction signing serialization signed by a signature. This - * signing serialization is hashed twice with `sha256`, and the - * digest is signed. + * The raw message signed by a data signature. This message is + * hashed once with `sha256`, and the digest is signed. */ - serialization: Uint8Array; + message: Uint8Array; } | { /** - * The raw message signed by a data signature. This message is - * hashed once with `sha256`, and the digest is signed. + * The transaction signing serialization signed by a signature. This + * signing serialization is hashed twice with `sha256`, and the + * digest is signed. */ - message: Uint8Array; + serialization: Uint8Array; }; } /** - * A method which accepts a string and returns either the successfully resolved + * A method that accepts a string and returns either the successfully resolved * bytecode or an error. The string will never be empty (`''`), so resolution * can skip checking the string's length. */ -export type IdentifierResolutionFunction = ( - identifier: string -) => +export type IdentifierResolutionFunction = (identifier: string) => | { bytecode: Uint8Array; + source: ResolvedScript; status: true; - type: IdentifierResolutionType.opcode; + type: IdentifierResolutionType.script; } - | ({ - bytecode: Uint8Array; - status: true; - type: IdentifierResolutionType.variable; - } & ResolutionDebug & - ResolutionSignature) | { bytecode: Uint8Array; - source: ResolvedScript; status: true; - type: IdentifierResolutionType.script; + type: IdentifierResolutionType.opcode; } - | ({ - error: string; - type: IdentifierResolutionErrorType.variable; - status: false; - recoverable: boolean; - /** - * Only available if this variable is present in the environment's - * `entityOwnership`. - */ - entityOwnership?: string; - } & ResolutionDebug) | { error: string; type: IdentifierResolutionErrorType.script; @@ -244,10 +227,27 @@ export type IdentifierResolutionFunction = ( error: string; type: IdentifierResolutionErrorType.unknown; status: false; - }; + } + | (ResolutionDebug & + ResolutionSignature & { + bytecode: Uint8Array; + status: true; + type: IdentifierResolutionType.variable; + }) + | (ResolutionDebug & { + error: string; + type: IdentifierResolutionErrorType.variable; + status: false; + recoverable: boolean; + /** + * Only available if this variable is present in the configuration's + * `entityOwnership`. + */ + entityOwnership?: string; + }); /** - * The result of reducing a single BTL script node. + * The result of reducing a single CashAssembly script node. */ export interface ScriptReductionTraceNode { bytecode: Uint8Array; @@ -275,10 +275,10 @@ export interface ScriptReductionTraceEvaluationNode } export type ScriptReductionTraceChildNode = - | ScriptReductionTraceNode | ScriptReductionTraceErrorNode - | ScriptReductionTracePushNode - | ScriptReductionTraceEvaluationNode; + | ScriptReductionTraceEvaluationNode + | ScriptReductionTraceNode + | ScriptReductionTracePushNode; /** * The ProgramState at a particular point in a sampled evaluation. @@ -289,24 +289,24 @@ export interface TraceSample { } /** - * A group of instructions which when read together are not malformed (contain - * incomplete push instructions). For example, the BTL `0x03 'a' 'b' 'c'` would - * be malformed if not evaluated together, since the `0x03` becomes - * `OP_PUSHBYTES_3`, and the UTF8 literals compile to `0x616263`. + * A group of instructions that when read together are not malformed (contain + * incomplete push instructions). For example, the CashAssembly + * `0x03 'a' 'b' 'c'` would be malformed if not evaluated together, since the + * `0x03` becomes `OP_PUSHBYTES_3`, and the UTF8 literals compile to `0x616263`. */ -export interface InstructionAggregation { - instructions: AuthenticationInstruction[]; +export interface InstructionAggregation { + instructions: AuthenticationInstruction[]; lastIp: number; range: Range; } -export interface InstructionAggregationSuccess { - aggregations: InstructionAggregation[]; +export interface InstructionAggregationSuccess { + aggregations: InstructionAggregation[]; success: true; } -export interface InstructionAggregationError { - aggregations: InstructionAggregation[]; +export interface InstructionAggregationError { + aggregations: InstructionAggregation[]; remainingBytecode: Uint8Array; remainingRange: Range; success: false; @@ -315,10 +315,10 @@ export interface InstructionAggregationError { /** * An evaluation sample extracted from a script reduction trace – includes the * range of the evaluation from which the sample was extracted, the instruction - * which was evaluated, the range in the source script over which the + * that was evaluated, the range in the source script over which the * instruction was defined, and the resulting program state. */ -export interface EvaluationSample { +export interface EvaluationSample { /** * The range of the evaluation node in which this sample was generated. * @@ -327,26 +327,26 @@ export interface EvaluationSample { */ evaluationRange: Range; /** - * The final instruction which was evaluated during this sample. + * The final instruction that was evaluated during this sample. * * Note, the first sample from any evaluation is the initial state before any * instructions are executed, so its `instruction` is `undefined`. For all * other samples, `instruction` must be defined. */ - instruction?: AuthenticationInstruction; + instruction?: AuthenticationInstruction; /** - * An ordered array of instructions and program states which occurred within + * An ordered array of instructions and program states that occurred within * the range of a single reduction trace node before the final instruction and * state (assigned to `instruction` and `state`, respectively). * * This occurs in unusual cases where multiple opcodes are defined in the same * reduced node, e.g. a long hex literal of operations as bytecode or an - * evaluation which is not wrapped in a push. + * evaluation that is not wrapped in a push. * * Usually, this will be an empty array. */ internalStates: { - instruction: AuthenticationInstruction; + instruction: AuthenticationInstruction; state: ProgramState; }[]; /** @@ -360,7 +360,7 @@ export interface EvaluationSample { } export interface CompilationResultResolve { - parse: BtlScriptSegment; + parse: CashAssemblyScriptSegment; resolve: ResolvedScript; } @@ -371,7 +371,7 @@ export interface CompilationResultReduce export interface CompilationResultErrorBase { errors: CompilationError[]; - errorType: 'parse' | 'resolve' | 'reduce'; + errorType: 'parse' | 'reduce' | 'resolve'; success: false; } @@ -382,7 +382,7 @@ export type CompilationError = /** * A compilation error from which it is not possible to recover. This includes * problems with the authentication template, missing dependencies in the - * compilation environment, and other errors which likely require meaningful + * compiler configuration, and other errors that likely require meaningful * software changes. */ export interface CompilationErrorFatal { @@ -409,12 +409,12 @@ export interface CompilationErrorFatal { */ export interface CompilationErrorRecoverable extends CompilationErrorFatal { /** - * The variable ID of the variable which – if provided in the compilation data + * The variable ID of the variable that – if provided in the compilation data * – would resolve this error. */ missingIdentifier: string; /** - * The ID of the entity which owns the variable referenced by + * The ID of the entity that owns the variable referenced by * `missingIdentifier`. */ owningEntity: string; @@ -442,8 +442,8 @@ export interface CompilationResultReduceError export type CompilationResultError = | CompilationResultParseError - | CompilationResultResolveError - | CompilationResultReduceError; + | CompilationResultReduceError + | CompilationResultResolveError; export interface CompilationResultSuccess extends CompilationResultReduce { @@ -452,20 +452,20 @@ export interface CompilationResultSuccess /** * The transformation type of the resulting bytecode. * - * Set to `p2sh-locking` if the resulting bytecode was transformed into a P2SH - * locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). + * Set to `p2sh20-locking` if the resulting bytecode was transformed into a + * P2SH20 locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). * - * Set to `p2sh-unlocking` if the resulting bytecode was transformed into a - * P2SH unlocking script (`result `). + * Set to `p2sh20-unlocking` if the resulting bytecode was transformed into a + * P2SH20 unlocking script (`result `). * * This property is not defined if the result was not transformed. */ - transformed?: 'p2sh-locking' | 'p2sh-unlocking'; + transformed?: 'p2sh20-locking' | 'p2sh20-unlocking'; } export type CompilationResult< - ProgramState = AuthenticationProgramStateStack & - AuthenticationProgramStateMinimum + ProgramState = AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack > = - | CompilationResultSuccess - | CompilationResultError; + | CompilationResultError + | CompilationResultSuccess; diff --git a/src/lib/language/language-utils.spec.ts b/src/lib/language/language-utils.spec.ts new file mode 100644 index 00000000..bf2feda2 --- /dev/null +++ b/src/lib/language/language-utils.spec.ts @@ -0,0 +1,4258 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable max-lines */ +import test from 'ava'; + +import type { Range } from '../lib'; +import { + AuthenticationErrorCommon, + compileCashAssembly, + containsRange, + createAuthenticationProgramEvaluationCommon, + createCompilerBCH, + createCompilerCommon, + createVirtualMachineBCH, + extractBytecodeResolutions, + extractEvaluationSamples, + extractEvaluationSamplesRecursive, + extractUnexecutedRanges, + hexToBin, + mergeRanges, + Opcodes, + stringifyErrors, + stringifyTestVector, +} from '../lib.js'; + +test('mergeRanges', (t) => { + t.deepEqual( + mergeRanges([ + { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, + { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, + ]), + { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 } + ); + t.deepEqual( + mergeRanges([ + { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, + { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, + ]), + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + ); + t.deepEqual( + mergeRanges([ + { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, + ]), + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + ); +}); + +test('containsRange', (t) => { + t.deepEqual( + containsRange( + { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, + { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 } + ), + true + ); + t.deepEqual( + containsRange( + { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, + { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 } + ), + false + ); + t.deepEqual( + containsRange( + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, + { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 } + ), + true + ); + t.deepEqual( + containsRange( + { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, + { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, + false + ), + true + ); +}); + +test('compileCashAssembly', (t) => { + const successful = compileCashAssembly('<0x010203>'); + t.deepEqual( + successful, + hexToBin('03010203'), + stringifyTestVector(successful) + ); + const failed = compileCashAssembly(''); + t.deepEqual( + failed, + 'CashAssembly compilation error: [1, 2]: Unknown identifier "bad".', + stringifyTestVector(failed) + ); +}); + +test('extractBytecodeResolutions', (t) => { + const compiler = createCompilerCommon({ + scripts: { + pushNumbers: '<1> var', + t: 'pushNumbers OP_ADD <0x03> OP_EQUAL <"abc"> OP_DROP <0b11> OP_EQUAL var2', + }, + variables: { var: { type: 'AddressData' }, var2: { type: 'AddressData' } }, + }); + + const compiled = compiler.generateBytecode({ + data: { bytecode: { var: Uint8Array.of(0) } }, + debug: true, + scriptId: 't', + }); + + if (!('resolve' in compiled)) { + t.fail(stringifyTestVector(compiled)); + return; + } + const result = extractBytecodeResolutions(compiled.resolve); + t.deepEqual( + result, + [ + { + bytecode: hexToBin('01'), + text: '1', + type: 'BigIntLiteral', + }, + { + bytecode: hexToBin('00'), + text: 'var', + type: 'variable', + }, + { + bytecode: hexToBin('5100'), + text: 'pushNumbers', + type: 'script', + }, + { + bytecode: hexToBin('93'), + text: 'OP_ADD', + type: 'opcode', + }, + { + bytecode: hexToBin('03'), + text: '03', + type: 'HexLiteral', + }, + { + bytecode: hexToBin('87'), + text: 'OP_EQUAL', + type: 'opcode', + }, + { + bytecode: hexToBin('616263'), + text: 'abc', + type: 'UTF8Literal', + }, + { + bytecode: hexToBin('75'), + text: 'OP_DROP', + type: 'opcode', + }, + { + bytecode: hexToBin('03'), + text: '11', + type: 'BinaryLiteral', + }, + { + bytecode: hexToBin('87'), + text: 'OP_EQUAL', + type: 'opcode', + }, + ], + stringifyTestVector(result) + ); +}); + +test('extractEvaluationSamples: empty trace', (t) => { + const result = extractEvaluationSamples({ + evaluationRange: { + endColumn: 0, + endLineNumber: 0, + startColumn: 0, + startLineNumber: 0, + }, + nodes: [], + trace: [], + }); + t.deepEqual( + result, + { + samples: [], + unmatchedStates: [], + }, + stringifyTestVector(result) + ); +}); + +const unexecutedLock = `OP_TOALTSTACK +OP_IF + <2> + OP_FROMALTSTACK + OP_IF + <3> + $( + <1> + OP_IF + <<4>> + OP_ELSE + <<5>> + OP_ENDIF + ) + 0x675667 // OP_ELSE OP_6 OP_ELSE + OP_ENDIF +OP_ELSE + <7> + OP_FROMALTSTACK + OP_IF + <$( + <7> <1> OP_ADD + )> + OP_ENDIF +OP_ENDIF`; + +const vm = createVirtualMachineBCH(); +const compiler = createCompilerBCH({ + scripts: { + docs: '0x00 0x01 0xab01 0xcd9300 $(OP_3 <0x00> OP_SWAP OP_CAT) 0x010203', + /** + * Second node closes an open sample, then fails during an internal state. + * The sample should use the error state and the instruction that caused + * it, ignoring any later (unexecuted) instructions. + */ + error1: '0x01 $(<0xab OP_RETURN OP_0>)', + /** + * `OP_0 OP_PUSHDATA_2 600 0x62[600 times]` - fails as first instruction of + * second node: `Push exceeds the push size limit of 520 bytes.` + */ + error2: + '0x004d5802 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"', + /** + * The second node causes an error, so only two samples and no unmatched + * states are returned. + */ + error3: 'OP_0 OP_RETURN OP_0 OP_0', + nested: `OP_0 + +< + $( + 0x0000 + $($() + + OP_2 + OP_ADD + + ) + $( <"abc"> + ) + OP_CAT + OP_CAT + ) + $( + <0> + <0> + $()) +>`, + nonPushingOpcodeUnlock: 'OP_1 OP_DUP', + unexecuted00: `<0> <0> ${unexecutedLock}`, + unexecuted01: `<0> <1> ${unexecutedLock}`, + unexecuted10: `<1> <0> ${unexecutedLock}`, + unexecuted11: `<1> <1> ${unexecutedLock}`, + unexecutedEmpty: ``, + }, +}); + +test.failing('extractEvaluationSamples: documentation example', (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'docs', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const program = createAuthenticationProgramEvaluationCommon(result.bytecode); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(program); + const actualTrace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); + /** + * We double the debugging trace just to test that the extra states are + * returned in `unmatchedStates`. + */ + const trace = [...actualTrace, ...actualTrace]; + const extracted = extractEvaluationSamples({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: Uint8Array.of(0), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: Uint8Array.of(0x01), + range: { + endColumn: 10, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('ab01'), + range: { + endColumn: 17, + endLineNumber: 1, + startColumn: 11, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('cd9300'), + range: { + endColumn: 26, + endLineNumber: 1, + startColumn: 18, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('0003'), + range: { + endColumn: 56, + endLineNumber: 1, + startColumn: 27, + startLineNumber: 1, + }, + source: { + bytecode: hexToBin('5301007c7e'), + range: { + endColumn: 55, + endLineNumber: 1, + startColumn: 29, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('53'), + range: { + endColumn: 33, + endLineNumber: 1, + startColumn: 29, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('0100'), + push: { + bytecode: hexToBin('00'), + range: { + endColumn: 39, + endLineNumber: 1, + startColumn: 35, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('00'), + range: { + endColumn: 39, + endLineNumber: 1, + startColumn: 35, + startLineNumber: 1, + }, + }, + ], + }, + range: { + endColumn: 40, + endLineNumber: 1, + startColumn: 34, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('7c'), + range: { + endColumn: 48, + endLineNumber: 1, + startColumn: 41, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('7e'), + range: { + endColumn: 55, + endLineNumber: 1, + startColumn: 49, + startLineNumber: 1, + }, + }, + ], + }, + + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('03')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('03'), Uint8Array.of(0)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0), hexToBin('03')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 4, + lastCodeSeparator: -1, + operationCount: 2, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('0003')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 83, + }, + { + data: Uint8Array.of(0), + opcode: 1, + }, + { + opcode: 124, + }, + { + opcode: 126, + }, + ], + ip: 4, + lastCodeSeparator: -1, + operationCount: 2, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('0003')], + }, + ], + }, + { + bytecode: hexToBin('010203'), + range: { + endColumn: 65, + endLineNumber: 1, + startColumn: 57, + startLineNumber: 1, + }, + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + traceWithUnlockingPhaseAndFinalState, + [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('ab')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('ab'), hexToBin('cd')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 4, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('f8')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 5, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('f8'), hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 6, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('f8'), hexToBin(''), hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 7, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [ + hexToBin(''), + hexToBin('f8'), + hexToBin(''), + hexToBin(''), + hexToBin('010203'), + ], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('ab'), + opcode: 1, + }, + { + data: hexToBin('cd'), + opcode: 1, + }, + { + opcode: 147, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('010203'), + opcode: 3, + }, + ], + ip: 7, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [ + hexToBin(''), + hexToBin('f8'), + hexToBin(''), + hexToBin(''), + hexToBin('010203'), + ], + }, + ], + stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + ); + + t.deepEqual(extracted, { + samples: [ + { + evaluationRange, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: trace[0], + }, + { + evaluationRange, + instruction: { data: Uint8Array.of(), opcode: 0 }, + internalStates: [], + range: nodes[0]!.range, + state: trace[1], + }, + { + evaluationRange, + instruction: { data: hexToBin('ab'), opcode: 1 }, + internalStates: [], + range: mergeRanges([nodes[1]!.range, nodes[2]!.range]), + state: trace[2], + }, + { + evaluationRange, + instruction: { data: hexToBin('cd'), opcode: 1 }, + internalStates: [], + range: mergeRanges([nodes[2]!.range, nodes[3]!.range]), + state: trace[3], + }, + { + evaluationRange, + instruction: { data: Uint8Array.of(), opcode: 0 }, + internalStates: [ + { + instruction: { opcode: 0x93 }, + state: trace[4], + }, + ], + range: nodes[3]!.range, + state: trace[5], + }, + { + evaluationRange, + instruction: { data: Uint8Array.of(), opcode: 0 }, + internalStates: [], + range: nodes[4]!.range, + state: trace[6], + }, + { + evaluationRange, + instruction: { data: hexToBin('010203'), opcode: 3 }, + internalStates: [], + range: mergeRanges([nodes[4]!.range, nodes[5]!.range]), + state: trace[7], + }, + ], + unmatchedStates: actualTrace, + }); +}); + +test('extractEvaluationSamples: error in initial validation', (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'nonPushingOpcodeUnlock', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const nullHashLength = 32; + const program = { + inputIndex: 0, + sourceOutputs: [ + { + lockingBytecode: Uint8Array.of(Opcodes.OP_1), + valueSatoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), + }, + ], + transaction: { + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: new Uint8Array(nullHashLength), + sequenceNumber: 0, + unlockingBytecode: result.bytecode, + }, + ], + locktime: 0, + outputs: [ + { + lockingBytecode: Uint8Array.of(), + valueSatoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), + }, + ], + version: 0, + }, + }; + + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const trace = vm.debug(program); + const extracted = extractEvaluationSamples({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: hexToBin('51'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('76'), + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + trace, + [ + { + alternateStack: [], + controlStack: [], + error: 'Unlocking bytecode may contain only push operations.', + instructions: [ + { + opcode: 81, + }, + { + opcode: 118, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + ], + stringifyTestVector(trace) + ); + + t.deepEqual(extracted, { + samples: [ + { + evaluationRange, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: trace[0], + }, + ], + unmatchedStates: [], + }); +}); + +test.failing( + "extractEvaluationSamples: node closes an open sample, then errors before the node's last instruction", + (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'error1', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const program = createAuthenticationProgramEvaluationCommon( + result.bytecode + ); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(program); + const trace = traceWithUnlockingPhaseAndFinalState.slice(1); + const extracted = extractEvaluationSamples({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: hexToBin('01'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('ab6a00'), + range: { + endColumn: 30, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + source: { + bytecode: hexToBin('03ab6a00'), + range: { + endColumn: 29, + endLineNumber: 1, + startColumn: 8, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('03ab6a00'), + push: { + bytecode: hexToBin('ab6a00'), + range: { + endColumn: 28, + endLineNumber: 1, + startColumn: 9, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('ab'), + range: { + endColumn: 13, + endLineNumber: 1, + startColumn: 9, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('6a'), + range: { + endColumn: 23, + endLineNumber: 1, + startColumn: 14, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('00'), + range: { + endColumn: 28, + endLineNumber: 1, + startColumn: 24, + startLineNumber: 1, + }, + }, + ], + }, + range: { + endColumn: 29, + endLineNumber: 1, + startColumn: 8, + startLineNumber: 1, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('ab6a00'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('ab6a00'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('ab6a00')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('ab6a00'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('ab6a00')], + }, + ], + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + traceWithUnlockingPhaseAndFinalState, + [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('ab'), + opcode: 1, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('ab'), + opcode: 1, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('ab')], + }, + { + alternateStack: [], + controlStack: [], + error: AuthenticationErrorCommon.calledReturn, + instructions: [ + { + data: hexToBin('ab'), + opcode: 1, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('ab')], + }, + { + alternateStack: [], + controlStack: [], + error: AuthenticationErrorCommon.calledReturn, + instructions: [ + { + data: hexToBin('ab'), + opcode: 1, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('ab')], + }, + ], + stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + ); + + t.deepEqual( + extracted, + { + samples: [ + { + evaluationRange, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: trace[0], + }, + { + evaluationRange, + instruction: { data: hexToBin('ab'), opcode: 1 }, + internalStates: [], + range: mergeRanges([nodes[0]!.range, nodes[1]!.range]), + state: trace[1], + }, + { + evaluationRange, + instruction: { opcode: Opcodes.OP_RETURN }, + internalStates: [], + range: nodes[1]!.range, + state: trace[2], + }, + ], + unmatchedStates: [], + }, + stringifyTestVector(extracted) + ); + } +); + +test('extractEvaluationSamples: node that closes an open sample with an error', (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'error2', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const program = createAuthenticationProgramEvaluationCommon(result.bytecode); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(program); + const trace = traceWithUnlockingPhaseAndFinalState.slice(1); + const extracted = extractEvaluationSamples({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: hexToBin('004d5802'), + range: { + endColumn: 11, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + range: { + endColumn: 614, + endLineNumber: 1, + startColumn: 12, + startLineNumber: 1, + }, + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + traceWithUnlockingPhaseAndFinalState, + [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + opcode: 77, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + opcode: 77, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + error: + 'Program attempted to push a stack item that exceeded the maximum stack item length (520 bytes). Item length: 600 bytes.', + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + opcode: 77, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + error: + 'Program attempted to push a stack item that exceeded the maximum stack item length (520 bytes). Item length: 600 bytes.', + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + opcode: 77, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + ], + stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + ); + + t.deepEqual(extracted, { + samples: [ + { + evaluationRange, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: trace[0], + }, + { + evaluationRange, + instruction: { data: Uint8Array.of(), opcode: 0 }, + internalStates: [], + range: nodes[0]!.range, + state: trace[1], + }, + { + evaluationRange, + instruction: { + data: hexToBin( + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + ), + opcode: 77, + }, + internalStates: [], + range: mergeRanges([nodes[0]!.range, nodes[1]!.range]), + state: trace[2], + }, + ], + unmatchedStates: [trace[3]], + }); +}); + +test('extractEvaluationSamples: error3 – error occurs, so final state is dropped', (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'error3', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const program = createAuthenticationProgramEvaluationCommon(result.bytecode); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(program); + const trace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); + const extracted = extractEvaluationSamples({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: hexToBin('00'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('6a'), + range: { + endColumn: 15, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('00'), + range: { + endColumn: 20, + endLineNumber: 1, + startColumn: 16, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('00'), + range: { + endColumn: 25, + endLineNumber: 1, + startColumn: 21, + startLineNumber: 1, + }, + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + traceWithUnlockingPhaseAndFinalState, + [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + error: 'Program called an OP_RETURN operation.', + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + error: 'Program called an OP_RETURN operation.', + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 106, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + ], + stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + ); + + t.deepEqual( + extracted, + { + samples: [ + { + evaluationRange, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: trace[0], + }, + { + evaluationRange, + instruction: { data: Uint8Array.of(), opcode: 0 }, + internalStates: [], + range: nodes[0]!.range, + state: trace[1], + }, + ], + unmatchedStates: [], + }, + stringifyTestVector(extracted) + ); +}); + +test.failing( + 'extractEvaluationSamplesRecursive: complex, deeply-nested script with irregular spacing', + (t) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId: 'nested', + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const program = createAuthenticationProgramEvaluationCommon( + result.bytecode + ); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(program); + const trace = traceWithUnlockingPhaseAndFinalState.slice(1); + const sampleResult = extractEvaluationSamplesRecursive({ + evaluationRange, + nodes, + trace, + }); + t.deepEqual( + nodes, + [ + { + bytecode: hexToBin('00'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('03616263'), + push: { + bytecode: hexToBin('616263'), + range: { + endColumn: 15, + endLineNumber: 20, + startColumn: 3, + startLineNumber: 4, + }, + script: [ + { + bytecode: hexToBin('616263'), + range: { + endColumn: 4, + endLineNumber: 16, + startColumn: 3, + startLineNumber: 4, + }, + source: { + bytecode: hexToBin('0000036162637e7e'), + range: { + endColumn: 9, + endLineNumber: 15, + startColumn: 3, + startLineNumber: 5, + }, + script: [ + { + bytecode: hexToBin('0000'), + range: { + endColumn: 9, + endLineNumber: 5, + startColumn: 3, + startLineNumber: 5, + }, + }, + { + bytecode: hexToBin('03'), + range: { + endColumn: 6, + endLineNumber: 11, + startColumn: 5, + startLineNumber: 6, + }, + source: { + bytecode: hexToBin('515293'), + range: { + endColumn: 13, + endLineNumber: 9, + startColumn: 7, + startLineNumber: 6, + }, + script: [ + { + bytecode: hexToBin('51'), + range: { + endColumn: 16, + endLineNumber: 6, + startColumn: 7, + startLineNumber: 6, + }, + source: { + bytecode: hexToBin('0151'), + range: { + endColumn: 15, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + script: [ + { + bytecode: hexToBin('0151'), + push: { + bytecode: hexToBin('51'), + range: { + endColumn: 14, + endLineNumber: 6, + startColumn: 10, + startLineNumber: 6, + }, + script: [ + { + bytecode: hexToBin('51'), + range: { + endColumn: 14, + endLineNumber: 6, + startColumn: 10, + startLineNumber: 6, + }, + }, + ], + }, + range: { + endColumn: 15, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('51'), + opcode: 1, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('51'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('51')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('51'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('51')], + }, + ], + }, + { + bytecode: hexToBin('52'), + range: { + endColumn: 11, + endLineNumber: 8, + startColumn: 7, + startLineNumber: 8, + }, + }, + { + bytecode: hexToBin('93'), + range: { + endColumn: 13, + endLineNumber: 9, + startColumn: 7, + startLineNumber: 9, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('01')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('01'), hexToBin('02')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('03')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('03')], + }, + ], + }, + { + bytecode: hexToBin('616263'), + range: { + endColumn: 6, + endLineNumber: 13, + startColumn: 5, + startLineNumber: 12, + }, + source: { + bytecode: hexToBin('03616263'), + range: { + endColumn: 15, + endLineNumber: 12, + startColumn: 8, + startLineNumber: 12, + }, + script: [ + { + bytecode: hexToBin('03616263'), + push: { + bytecode: hexToBin('616263'), + range: { + endColumn: 14, + endLineNumber: 12, + startColumn: 9, + startLineNumber: 12, + }, + script: [ + { + bytecode: hexToBin('616263'), + range: { + endColumn: 14, + endLineNumber: 12, + startColumn: 9, + startLineNumber: 12, + }, + }, + ], + }, + range: { + endColumn: 15, + endLineNumber: 12, + startColumn: 8, + startLineNumber: 12, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + ], + }, + { + bytecode: hexToBin('7e'), + range: { + endColumn: 9, + endLineNumber: 14, + startColumn: 3, + startLineNumber: 14, + }, + }, + { + bytecode: hexToBin('7e'), + range: { + endColumn: 9, + endLineNumber: 15, + startColumn: 3, + startLineNumber: 15, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin(''), hexToBin('616263')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 4, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 5, + lastCodeSeparator: -1, + operationCount: 2, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 5, + lastCodeSeparator: -1, + operationCount: 2, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + ], + }, + { + bytecode: hexToBin(''), + range: { + endColumn: 15, + endLineNumber: 20, + startColumn: 3, + startLineNumber: 17, + }, + source: { + bytecode: hexToBin('00007e'), + range: { + endColumn: 14, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 18, + }, + script: [ + { + bytecode: hexToBin('00'), + push: { + bytecode: hexToBin(''), + range: { + endColumn: 7, + endLineNumber: 18, + startColumn: 6, + startLineNumber: 18, + }, + script: [ + { + bytecode: hexToBin(''), + range: { + endColumn: 7, + endLineNumber: 18, + startColumn: 6, + startLineNumber: 18, + }, + }, + ], + }, + range: { + endColumn: 8, + endLineNumber: 18, + startColumn: 5, + startLineNumber: 18, + }, + }, + { + bytecode: hexToBin('00'), + push: { + bytecode: hexToBin(''), + range: { + endColumn: 7, + endLineNumber: 19, + startColumn: 6, + startLineNumber: 19, + }, + script: [ + { + bytecode: hexToBin(''), + range: { + endColumn: 7, + endLineNumber: 19, + startColumn: 6, + startLineNumber: 19, + }, + }, + ], + }, + range: { + endColumn: 8, + endLineNumber: 19, + startColumn: 5, + startLineNumber: 19, + }, + }, + { + bytecode: hexToBin('7e'), + range: { + endColumn: 14, + endLineNumber: 20, + startColumn: 3, + startLineNumber: 20, + }, + source: { + bytecode: hexToBin('017e'), + range: { + endColumn: 13, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + script: [ + { + bytecode: hexToBin('017e'), + push: { + bytecode: hexToBin('7e'), + range: { + endColumn: 12, + endLineNumber: 20, + startColumn: 6, + startLineNumber: 20, + }, + script: [ + { + bytecode: hexToBin('7e'), + range: { + endColumn: 12, + endLineNumber: 20, + startColumn: 6, + startLineNumber: 20, + }, + }, + ], + }, + range: { + endColumn: 13, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('7e'), + opcode: 1, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('7e'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('7e')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('7e'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('7e')], + }, + ], + }, + ], + }, + trace: [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + ], + }, + ], + }, + range: { + endColumn: 2, + endLineNumber: 21, + startColumn: 1, + startLineNumber: 3, + }, + }, + ], + stringifyTestVector(nodes) + ); + + t.deepEqual( + traceWithUnlockingPhaseAndFinalState, + [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + ], + stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + ); + + t.deepEqual( + sampleResult, + { + samples: [ + { + evaluationRange: { + endColumn: 2, + endLineNumber: 21, + startColumn: 1, + startLineNumber: 1, + }, + internalStates: [], + range: { + endColumn: 1, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 2, + endLineNumber: 21, + startColumn: 1, + startLineNumber: 1, + }, + instruction: { + data: hexToBin(''), + opcode: 0, + }, + internalStates: [], + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + }, + { + evaluationRange: { + endColumn: 3, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 4, + }, + internalStates: [], + range: { + endColumn: 5, + endLineNumber: 4, + startColumn: 5, + startLineNumber: 4, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 3, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 4, + }, + instruction: { + data: hexToBin(''), + opcode: 0, + }, + internalStates: [ + { + instruction: { + data: hexToBin(''), + opcode: 0, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + }, + ], + range: { + endColumn: 9, + endLineNumber: 5, + startColumn: 3, + startLineNumber: 5, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('')], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 11, + startColumn: 7, + startLineNumber: 6, + }, + internalStates: [], + range: { + endColumn: 7, + endLineNumber: 6, + startColumn: 7, + startLineNumber: 6, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 15, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + internalStates: [], + range: { + endColumn: 9, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('51'), + opcode: 1, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 15, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + instruction: { + data: hexToBin('51'), + opcode: 1, + }, + internalStates: [], + range: { + endColumn: 15, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('51'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('51')], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 11, + startColumn: 7, + startLineNumber: 6, + }, + instruction: { + opcode: 81, + }, + internalStates: [], + range: { + endColumn: 16, + endLineNumber: 6, + startColumn: 7, + startLineNumber: 6, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('01')], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 11, + startColumn: 7, + startLineNumber: 6, + }, + instruction: { + opcode: 82, + }, + internalStates: [], + range: { + endColumn: 11, + endLineNumber: 8, + startColumn: 7, + startLineNumber: 8, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('01'), hexToBin('02')], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 11, + startColumn: 7, + startLineNumber: 6, + }, + instruction: { + opcode: 147, + }, + internalStates: [], + range: { + endColumn: 13, + endLineNumber: 9, + startColumn: 7, + startLineNumber: 9, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 81, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('03')], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 13, + startColumn: 7, + startLineNumber: 12, + }, + internalStates: [], + range: { + endColumn: 7, + endLineNumber: 12, + startColumn: 7, + startLineNumber: 12, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 5, + endLineNumber: 13, + startColumn: 7, + startLineNumber: 12, + }, + instruction: { + data: hexToBin('616263'), + opcode: 3, + }, + internalStates: [], + range: { + endColumn: 15, + endLineNumber: 12, + startColumn: 8, + startLineNumber: 12, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + }, + { + evaluationRange: { + endColumn: 3, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 4, + }, + instruction: { + data: hexToBin('616263'), + opcode: 3, + }, + internalStates: [], + range: { + endColumn: 6, + endLineNumber: 13, + startColumn: 5, + startLineNumber: 6, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin(''), hexToBin('616263')], + }, + }, + { + evaluationRange: { + endColumn: 3, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 4, + }, + instruction: { + opcode: 126, + }, + internalStates: [], + range: { + endColumn: 9, + endLineNumber: 14, + startColumn: 3, + startLineNumber: 14, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 4, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + }, + { + evaluationRange: { + endColumn: 3, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 4, + }, + instruction: { + opcode: 126, + }, + internalStates: [], + range: { + endColumn: 9, + endLineNumber: 15, + startColumn: 3, + startLineNumber: 15, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + { + opcode: 126, + }, + { + opcode: 126, + }, + ], + ip: 5, + lastCodeSeparator: -1, + operationCount: 2, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('616263')], + }, + }, + { + evaluationRange: { + endColumn: 14, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 17, + }, + internalStates: [], + range: { + endColumn: 5, + endLineNumber: 17, + startColumn: 5, + startLineNumber: 17, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 14, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 17, + }, + instruction: { + data: hexToBin(''), + opcode: 0, + }, + internalStates: [], + range: { + endColumn: 8, + endLineNumber: 18, + startColumn: 5, + startLineNumber: 18, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + }, + { + evaluationRange: { + endColumn: 14, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 17, + }, + instruction: { + data: hexToBin(''), + opcode: 0, + }, + internalStates: [], + range: { + endColumn: 8, + endLineNumber: 19, + startColumn: 5, + startLineNumber: 19, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('')], + }, + }, + { + evaluationRange: { + endColumn: 13, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + internalStates: [], + range: { + endColumn: 5, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('7e'), + opcode: 1, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + }, + { + evaluationRange: { + endColumn: 13, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + instruction: { + data: hexToBin('7e'), + opcode: 1, + }, + internalStates: [], + range: { + endColumn: 13, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin('7e'), + opcode: 1, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('7e')], + }, + }, + { + evaluationRange: { + endColumn: 14, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 17, + }, + instruction: { + opcode: 126, + }, + internalStates: [], + range: { + endColumn: 14, + endLineNumber: 20, + startColumn: 3, + startLineNumber: 20, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin(''), + opcode: 0, + }, + { + opcode: 126, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin('')], + }, + }, + { + evaluationRange: { + endColumn: 2, + endLineNumber: 21, + startColumn: 1, + startLineNumber: 1, + }, + instruction: { + data: hexToBin('616263'), + opcode: 3, + }, + internalStates: [], + range: { + endColumn: 2, + endLineNumber: 21, + startColumn: 1, + startLineNumber: 3, + }, + state: { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + }, + ], + unmatchedStates: [ + { + alternateStack: [], + controlStack: [], + instructions: [ + { + data: hexToBin(''), + opcode: 0, + }, + { + data: hexToBin('616263'), + opcode: 3, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [hexToBin(''), hexToBin('616263')], + }, + ], + }, + stringifyTestVector(sampleResult) + ); + } +); + +const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ + // eslint-disable-next-line max-params + exec: (t, scriptId, ranges, specifyStart) => { + const result = compiler.generateBytecode({ + data: {}, + debug: true, + scriptId, + }); + if (!result.success) { + t.fail(stringifyErrors(result.errors)); + return; + } + const testProgram = createAuthenticationProgramEvaluationCommon( + result.bytecode + ); + const nodes = result.reduce.script; + const evaluationRange = result.reduce.range; + const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); + const trace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); + const { samples } = extractEvaluationSamplesRecursive({ + evaluationRange, + nodes, + trace, + }); + const unexecutedRanges = extractUnexecutedRanges( + samples, + specifyStart === undefined ? undefined : '1,1' + ); + t.deepEqual( + unexecutedRanges, + ranges, + stringifyTestVector(unexecutedRanges) + ); + }, + title: (_, scriptId) => `extractUnexecutedRangesMacro: ${scriptId}`, +}); + +test( + extractUnexecutedRangesMacro, + 'unexecuted00', + [ + { + endColumn: 8, + endLineNumber: 3, + startColumn: 5, + startLineNumber: 3, + }, + { + endColumn: 20, + endLineNumber: 4, + startColumn: 5, + startLineNumber: 4, + }, + { + endColumn: 10, + endLineNumber: 5, + startColumn: 5, + startLineNumber: 5, + }, + { + endColumn: 12, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + { + endColumn: 10, + endLineNumber: 14, + startColumn: 9, + startLineNumber: 7, + }, + { + endColumn: 13, + endLineNumber: 15, + startColumn: 5, + startLineNumber: 15, + }, + { + endColumn: 13, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 16, + }, + { + endColumn: 11, + endLineNumber: 23, + startColumn: 9, + startLineNumber: 21, + }, + ], + true +); + +test(extractUnexecutedRangesMacro, 'unexecuted01', [ + { + endColumn: 8, + endLineNumber: 3, + startColumn: 5, + startLineNumber: 3, + }, + { + endColumn: 20, + endLineNumber: 4, + startColumn: 5, + startLineNumber: 4, + }, + { + endColumn: 10, + endLineNumber: 5, + startColumn: 5, + startLineNumber: 5, + }, + { + endColumn: 12, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + { + endColumn: 10, + endLineNumber: 14, + startColumn: 9, + startLineNumber: 7, + }, + { + endColumn: 13, + endLineNumber: 15, + startColumn: 5, + startLineNumber: 15, + }, + { + endColumn: 13, + endLineNumber: 16, + startColumn: 5, + startLineNumber: 16, + }, +]); + +test(extractUnexecutedRangesMacro, 'unexecuted10', [ + { + endColumn: 12, + endLineNumber: 6, + startColumn: 9, + startLineNumber: 6, + }, + { + endColumn: 10, + endLineNumber: 14, + startColumn: 9, + startLineNumber: 7, + }, + { + endColumn: 8, + endLineNumber: 18, + startColumn: 5, + startLineNumber: 18, + }, + { + endColumn: 20, + endLineNumber: 19, + startColumn: 5, + startLineNumber: 19, + }, + { + endColumn: 10, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + { + endColumn: 11, + endLineNumber: 23, + startColumn: 9, + startLineNumber: 21, + }, + { + endColumn: 13, + endLineNumber: 24, + startColumn: 5, + startLineNumber: 24, + }, +]); + +test(extractUnexecutedRangesMacro, 'unexecuted11', [ + { + endColumn: 22, + endLineNumber: 12, + startColumn: 17, + startLineNumber: 12, + }, + { + endColumn: 8, + endLineNumber: 18, + startColumn: 5, + startLineNumber: 18, + }, + { + endColumn: 20, + endLineNumber: 19, + startColumn: 5, + startLineNumber: 19, + }, + { + endColumn: 10, + endLineNumber: 20, + startColumn: 5, + startLineNumber: 20, + }, + { + endColumn: 11, + endLineNumber: 23, + startColumn: 9, + startLineNumber: 21, + }, + { + endColumn: 13, + endLineNumber: 24, + startColumn: 5, + startLineNumber: 24, + }, +]); + +test(extractUnexecutedRangesMacro, 'unexecutedEmpty', []); diff --git a/src/lib/template/language/language-utils.ts b/src/lib/language/language-utils.ts similarity index 71% rename from src/lib/template/language/language-utils.ts rename to src/lib/language/language-utils.ts index 5b4bf2a6..d796e4ae 100644 --- a/src/lib/template/language/language-utils.ts +++ b/src/lib/language/language-utils.ts @@ -1,18 +1,10 @@ -import { flattenBinArray } from '../../format/hex'; -import { +import { binToHex, flattenBinArray } from '../format/format.js'; +import type { AuthenticationInstruction, - ParsedAuthenticationInstruction, - ParsedAuthenticationInstructionMalformed, -} from '../../vm/instruction-sets/instruction-sets-types'; -import { - authenticationInstructionIsMalformed, - parseBytecode, - serializeParsedAuthenticationInstructionMalformed, -} from '../../vm/instruction-sets/instruction-sets-utils'; -import { AuthenticationProgramStateExecutionStack } from '../../vm/vm'; -import { createCompilerCommonSynchronous } from '../compiler'; - -import { + AuthenticationInstructionMalformed, + AuthenticationInstructionMaybeMalformed, + AuthenticationProgramStateCommon, + AuthenticationProgramStateControlStack, CompilationError, CompilationErrorRecoverable, EvaluationSample, @@ -21,7 +13,14 @@ import { ResolvedSegmentLiteralType, ScriptReductionTraceChildNode, ScriptReductionTraceScriptNode, -} from './language-types'; +} from '../lib'; +import { + authenticationInstructionIsMalformed, + decodeAuthenticationInstructions, + decodeVmNumber, + encodeAuthenticationInstructionMalformed, + OpcodesBCH, +} from '../vm/vm.js'; const pluckStartPosition = (range: Range) => ({ startColumn: range.startColumn, @@ -52,7 +51,8 @@ export const mergeRanges = ( const unsortedMerged = ranges.length < minimumRangesToMerge ? ranges.length === 1 - ? ranges[0] + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ranges[0]! : parentRange : ranges.reduce( // eslint-disable-next-line complexity @@ -70,7 +70,8 @@ export const mergeRanges = ( ? pluckStartPosition(range) : pluckStartPosition(merged)), }), - ranges[0] + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + ranges[0]! ); return { ...pluckEndPosition(unsortedMerged), @@ -114,37 +115,10 @@ export const containsRange = ( }; /** - * Perform a simplified compilation on a Bitauth Templating Language (BTL) - * script containing only hex literals, bigint literals, UTF8 literals, and push - * statements. Scripts may not contain variables/operations, evaluations, or - * opcode identifiers (use hex literals instead). - * - * This is useful for accepting complex user input in advanced interfaces, - * especially for `AddressData` and `WalletData`. - * - * Returns the compiled bytecode as a `Uint8Array`, or throws an error message. - * - * @param script - a simple BTL script containing no variables or evaluations - */ -export const compileBtl = (script: string) => { - const result = createCompilerCommonSynchronous({ - scripts: { script }, - }).generateBytecode('script', {}); - if (result.success) { - return result.bytecode; - } - return `BTL compilation error:${result.errors.reduce( - (all, { error, range }) => - `${all} [${range.startLineNumber}, ${range.startColumn}]: ${error}`, - '' - )}`; -}; - -/** - * Extract a list of the errors which occurred while resolving a script. + * Extract a list of the errors that occurred while resolving a script. * - * @param resolvedScript - the result of `resolveScript` from which to extract - * errors + * @param resolvedScript - the result of {@link resolveScript} from which to + * extract errors */ export const getResolutionErrors = ( resolvedScript: ResolvedScript @@ -191,24 +165,25 @@ export const allErrorsAreRecoverable = ( ); /** - * A single resolution for a `ResolvedSegment`. The `variable`, `script`, or - * `opcode` property contains the full identifier which resolved to `bytecode`. + * A single resolution for a {@link ResolvedSegment}. The `variable`, `script`, + * or `opcode` property contains the full identifier that resolved + * to `bytecode`. */ -export interface BtlResolution { +export interface CashAssemblyResolution { bytecode: Uint8Array; - type: 'variable' | 'script' | 'opcode' | ResolvedSegmentLiteralType; + type: ResolvedSegmentLiteralType | 'opcode' | 'script' | 'variable'; text: string; } /** - * Get an array of all resolutions used in a `ResolvedScript`. + * Get an array of all resolutions used in a {@link ResolvedScript}. * @param resolvedScript - the resolved script to search */ export const extractBytecodeResolutions = ( resolvedScript: ResolvedScript -): BtlResolution[] => +): CashAssemblyResolution[] => // eslint-disable-next-line complexity - resolvedScript.reduce((all, segment) => { + resolvedScript.reduce((all, segment) => { switch (segment.type) { case 'push': case 'evaluation': @@ -259,8 +234,8 @@ export const extractBytecodeResolutions = ( }, []); /** - * Extract an object mapping the variable identifiers used in a `ResolvedScript` - * to their resolved bytecode. + * Extract an object mapping the variable identifiers used in a + * {@link ResolvedScript} to their resolved bytecode. * * @param resolvedScript - the resolved script to search */ @@ -278,8 +253,8 @@ export const extractResolvedVariableBytecodeMap = ( ); /** - * Format a list of `CompilationError`s into a single string, with an error - * start position following each error. E.g. for line 1, column 2: + * Format a list of {@link CompilationError}s into a single string, with an + * error start position following each error. E.g. for line 1, column 2: * `The error message. [1, 2]` * * Errors are separated with the `separator`, which defaults to `; `, e.g.: @@ -288,24 +263,20 @@ export const extractResolvedVariableBytecodeMap = ( * @param errors - an array of compilation errors * @param separator - the characters with which to join the formatted errors. */ -export const stringifyErrors = ( - errors: CompilationError[], - separator = '; ' -) => { - return `${errors +export const stringifyErrors = (errors: CompilationError[], separator = '; ') => + `${errors .map( (error) => `[${error.range.startLineNumber}, ${error.range.startColumn}] ${error.error}` ) .join(separator)}`; -}; -export interface SampleExtractionResult { +export interface SampleExtractionResult { /** * The samples successfully extracted from the provided `nodes` and `trace`. * * In a successful evaluation, one sample will be produced for each state in - * `trace` with the exception of the last state (the evaluation result) which + * `trace` with the exception of the last state (the evaluation result), which * will be returned in `unmatchedStates`. * * In an unsuccessful evaluation, the `trace` states will be exhausted before @@ -313,7 +284,7 @@ export interface SampleExtractionResult { * returned, and the final state (the evaluation result) is dropped. This can * be detected by checking if the length of `unmatchedStates` is `0`. */ - samples: EvaluationSample[]; + samples: EvaluationSample[]; /** * If the provided `nodes` are exhausted before all states from `trace` have * been matched, the remaining "unmatched" states are returned. This is useful @@ -328,10 +299,11 @@ export interface SampleExtractionResult { } /** - * Extract a set of "evaluation samples" from the result of a BTL compilation - * and a matching debug trace (from `vm.debug`), pairing program states with the - * source ranges which produced them – like a "source map" for complete - * evaluations. This is useful for omniscient debuggers like Bitauth IDE. + * Extract a set of "evaluation samples" from the result of a CashAssembly + * compilation and a matching debug trace (from `vm.debug`), pairing program + * states with the source ranges that produced them – like a "source map" for + * complete evaluations. This is useful for omniscient debuggers like + * Bitauth IDE. * * Returns an array of samples and an array of unmatched program states * remaining if `nodes` doesn't contain enough instructions to consume all @@ -348,7 +320,8 @@ export interface SampleExtractionResult { * of `0`.) * * This method allows for samples to be extracted from a single evaluation; - * most applications should use `extractEvaluationSamplesRecursive` instead. + * most applications should use + * {@link extractEvaluationSamplesRecursive} instead. * * @remarks * This method incrementally concatenates the reduced bytecode from each node, @@ -356,7 +329,7 @@ export interface SampleExtractionResult { * * Each node can contain only a portion of an instruction (like a long push * operation), or it can contain multiple instructions (like a long hex literal - * representing a string of bytecode or an evaluation which is not wrapped by a + * representing a string of bytecode or an evaluation that is not wrapped by a * push). * * If a node contains only a portion of an instruction, the bytecode from @@ -373,7 +346,7 @@ export interface SampleExtractionResult { * in a sample (usually caused by an evaluation error), the last instruction * with a matching program state is used for the sample (with its program * state), and the unmatched instructions are ignored. (This allows the "last - * known state" to be displayed for the sample which caused evaluation to halt.) + * known state" to be displayed for the sample that caused evaluation to halt.) * * --- * @@ -401,11 +374,11 @@ export interface SampleExtractionResult { * responsible for the initial `0x00` and which are responsible for the `0x03`. * * For this reason, the range of each sample is limited to the range(s) of one - * or more adjacent nodes. Samples may overlap in the range of a node which is + * or more adjacent nodes. Samples may overlap in the range of a node that is * responsible for both ending a previous sample and beginning a new sample. * (Though, only 2 samples can overlap. If a node is responsible for more than 2 * instructions, the second sample includes `internalStates` for instructions - * which occur before the end of the second sample.) + * that occur before the end of the second sample.) * * In this case, there are 6 samples identified below within `[]`, where each * `[` is closed by the closest following `]` (no nesting): @@ -434,23 +407,28 @@ export interface SampleExtractionResult { * Note, this implementation relies on the expectation that `trace` begins with * the initial program state, contains a single program state per instruction, * and ends with the final program state (as produced by `vm.debug`). It also - * expects the `bytecode` provided by nodes to be parsable by `parseBytecode`. - * - * @param evaluationRange - the range of the script node which was evaluated to - * produce the `trace` - * @param nodes - an array of reduced nodes to parse - * @param trace - the `vm.debug` result to map to these nodes + * expects the `bytecode` provided by nodes to be parsable by + * {@link decodeAuthenticationInstructions}. */ // eslint-disable-next-line complexity -export const extractEvaluationSamples = ({ +export const extractEvaluationSamples = ({ evaluationRange, nodes, trace, }: { + /** + * The range of the script node that was evaluated to produce the `trace` + */ evaluationRange: Range; + /** + * An array of reduced nodes to parse + */ nodes: ScriptReductionTraceScriptNode['script']; + /** + * The `vm.debug` result to map to these nodes + */ trace: ProgramState[]; -}): SampleExtractionResult => { +}): SampleExtractionResult => { const traceWithoutFinalState = trace.length > 1 ? trace.slice(0, -1) : trace.slice(); if (traceWithoutFinalState.length === 0) { @@ -459,7 +437,7 @@ export const extractEvaluationSamples = ({ unmatchedStates: [], }; } - const samples: EvaluationSample[] = [ + const samples: EvaluationSample[] = [ { evaluationRange, internalStates: [], @@ -469,7 +447,8 @@ export const extractEvaluationSamples = ({ startColumn: evaluationRange.startColumn, startLineNumber: evaluationRange.startLineNumber, }, - state: traceWithoutFinalState[0], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + state: traceWithoutFinalState[0]!, }, ]; @@ -481,7 +460,8 @@ export const extractEvaluationSamples = ({ let incomplete: { bytecode: Uint8Array; range: Range } | undefined; // eslint-disable-next-line functional/no-loop-statement while (nextState < traceWithoutFinalState.length && nextNode < nodes.length) { - const currentNode = nodes[nextNode]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const currentNode = nodes[nextNode]!; const { mergedBytecode, mergedRange } = incomplete === undefined ? { @@ -496,18 +476,19 @@ export const extractEvaluationSamples = ({ mergedRange: mergeRanges([incomplete.range, currentNode.range]), }; - const parsed = parseBytecode(mergedBytecode); + const decoded = decodeAuthenticationInstructions(mergedBytecode); + const [zeroth] = decoded; const hasNonMalformedInstructions = - parsed.length !== 0 && !('malformed' in parsed[0]); + zeroth !== undefined && !('malformed' in zeroth); if (hasNonMalformedInstructions) { - const lastInstruction = parsed[parsed.length - 1]; - const validInstructions = (authenticationInstructionIsMalformed( - lastInstruction - ) - ? parsed.slice(0, parsed.length - 1) - : parsed) as AuthenticationInstruction[]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const lastInstruction = decoded[decoded.length - 1]!; + const validInstructions: AuthenticationInstruction[] = + authenticationInstructionIsMalformed(lastInstruction) + ? decoded.slice(0, decoded.length - 1) + : decoded; const firstUnmatchedStateIndex = nextState + validInstructions.length; const matchingStates = traceWithoutFinalState.slice( nextState, @@ -515,14 +496,14 @@ export const extractEvaluationSamples = ({ ); const pairedStates = validInstructions.map((instruction, index) => ({ instruction, - state: matchingStates[index] as ProgramState | undefined, + state: matchingStates[index], })); /** * Guaranteed to have a defined `state` (or the loop would have exited). */ const firstPairedState = pairedStates[0] as { - instruction: ParsedAuthenticationInstruction; + instruction: AuthenticationInstructionMaybeMalformed; state: ProgramState; }; @@ -552,7 +533,7 @@ export const extractEvaluationSamples = ({ // eslint-disable-next-line functional/no-conditional-statement if (closesASecondSample) { const finalState = pairedStates[sampleClosingIndex] as { - instruction: ParsedAuthenticationInstruction; + instruction: AuthenticationInstructionMaybeMalformed; state: ProgramState; }; const secondSamplePairsBegin = closesCurrentlyOpenSample ? 1 : 0; @@ -560,7 +541,7 @@ export const extractEvaluationSamples = ({ secondSamplePairsBegin, sampleClosingIndex ) as { - instruction: ParsedAuthenticationInstruction; + instruction: AuthenticationInstructionMaybeMalformed; state: ProgramState; }[]; // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data @@ -579,9 +560,7 @@ export const extractEvaluationSamples = ({ if (authenticationInstructionIsMalformed(lastInstruction)) { // eslint-disable-next-line functional/no-expression-statement incomplete = { - bytecode: serializeParsedAuthenticationInstructionMalformed( - lastInstruction - ), + bytecode: encodeAuthenticationInstructionMalformed(lastInstruction), range: currentNode.range, }; // eslint-disable-next-line functional/no-conditional-statement @@ -591,8 +570,8 @@ export const extractEvaluationSamples = ({ } // eslint-disable-next-line functional/no-conditional-statement } else { - const lastInstruction = parsed[parsed.length - 1] as - | ParsedAuthenticationInstructionMalformed + const lastInstruction = decoded[decoded.length - 1] as + | AuthenticationInstructionMalformed | undefined; // eslint-disable-next-line functional/no-expression-statement @@ -600,9 +579,8 @@ export const extractEvaluationSamples = ({ lastInstruction === undefined ? undefined : { - bytecode: serializeParsedAuthenticationInstructionMalformed( - lastInstruction - ), + bytecode: + encodeAuthenticationInstructionMalformed(lastInstruction), range: mergedRange, }; } @@ -629,48 +607,49 @@ export const extractEvaluationSamples = ({ }; /** - * Similar to `extractEvaluationSamples`, but recursively extracts samples from - * evaluations within the provided array of nodes. + * Similar to {@link extractEvaluationSamples}, but recursively extracts samples + * from evaluations within the provided array of nodes. * - * Because BTL evaluations are fully self-contained, there should never be - * unmatched states from evaluations within a script reduction trace tree. (For - * this reason, this method does not return the `unmatchedStates` from nested - * evaluations.) + * Because CashAssembly evaluations are fully self-contained, there should never + * be unmatched states from evaluations within a script reduction trace tree. + * (For this reason, this method does not return the `unmatchedStates` from + * nested evaluations.) * * Returned samples are ordered by the ending position (line and column) of - * their range. Samples from BTL evaluations which occur within an outer - * evaluation appear before their parent sample (which uses their result). - * - * @param evaluationRange - the range of the script node which was evaluated to - * produce the `trace` - * @param nodes - an array of reduced nodes to parse - * @param trace - the `vm.debug` result to map to these nodes + * their range. Samples from CashAssembly evaluations that occur within an + * outer evaluation appear before their parent sample (which uses their result). */ -export const extractEvaluationSamplesRecursive = < - ProgramState, - Opcodes = number ->({ +export const extractEvaluationSamplesRecursive = ({ + /** + * The range of the script node that was evaluated to produce the `trace` + */ evaluationRange, + /** + * An array of reduced nodes to parse + */ nodes, + /** + * The `vm.debug` result to map to these nodes + */ trace, }: { evaluationRange: Range; nodes: ScriptReductionTraceScriptNode['script']; trace: ProgramState[]; -}): SampleExtractionResult => { +}): SampleExtractionResult => { const extractEvaluations = ( node: ScriptReductionTraceChildNode, depth = 1 - ): EvaluationSample[] => { + ): EvaluationSample[] => { if ('push' in node) { - return node.push.script.reduce[]>( + return node.push.script.reduce[]>( (all, childNode) => [...all, ...extractEvaluations(childNode, depth)], [] ); } if ('source' in node) { const childSamples = node.source.script.reduce< - EvaluationSample[] + EvaluationSample[] >( (all, childNode) => [ ...all, @@ -681,7 +660,7 @@ export const extractEvaluationSamplesRecursive = < const traceWithoutUnlockingPhase = node.trace.slice(1); const evaluationBeginToken = '$('; const evaluationEndToken = ')'; - const extracted = extractEvaluationSamples({ + const extracted = extractEvaluationSamples({ evaluationRange: { endColumn: node.range.endColumn - evaluationEndToken.length, endLineNumber: node.range.endLineNumber, @@ -696,16 +675,13 @@ export const extractEvaluationSamplesRecursive = < return []; }; - const { samples, unmatchedStates } = extractEvaluationSamples< - ProgramState, - Opcodes - >({ + const { samples, unmatchedStates } = extractEvaluationSamples({ evaluationRange, nodes, trace, }); - const childSamples = nodes.reduce[]>( + const childSamples = nodes.reduce[]>( (all, node) => [...all, ...extractEvaluations(node)], [] ); @@ -723,23 +699,23 @@ export const extractEvaluationSamplesRecursive = < }; }; -const stateIsExecuting = (state: AuthenticationProgramStateExecutionStack) => - state.executionStack.every((item) => item); +const stateIsExecuting = (state: AuthenticationProgramStateControlStack) => + state.controlStack.every((item) => item); /** - * Extract an array of ranges which were unused by an evaluation. This is useful - * in development tooling for fading out or hiding code which is unimportant to + * Extract an array of ranges that were unused by an evaluation. This is useful + * in development tooling for fading out or hiding code that is unimportant to * the current evaluation being tested. * * @remarks - * Only ranges which are guaranteed to be unimportant to an evaluation are - * returned by this method. These ranges are extracted from samples which: - * - are preceded by a sample which ends with execution disabled (e.g. an + * Only ranges that are guaranteed to be unimportant to an evaluation are + * returned by this method. These ranges are extracted from samples that: + * - are preceded by a sample that ends with execution disabled (e.g. an * unsuccessful `OP_IF`) * - end with execution disabled, and - * - contain no `internalStates` which enable execution. + * - contain no `internalStates` that enable execution. * - * Note, internal states which temporarily re-enable and then disable execution + * Note, internal states that temporarily re-enable and then disable execution * again can still have an effect on the parent evaluation, so this method * conservatively excludes such samples. For example, the hex literal * `0x675167`, which encodes `OP_ELSE OP_1 OP_ELSE`, could begin and end with @@ -755,10 +731,9 @@ const stateIsExecuting = (state: AuthenticationProgramStateExecutionStack) => * executing), defaults to `1,1` */ export const extractUnexecutedRanges = < - ProgramState extends AuthenticationProgramStateExecutionStack, - Opcodes = number + ProgramState extends AuthenticationProgramStateControlStack >( - samples: EvaluationSample[], + samples: EvaluationSample[], evaluationBegins = '1,1' ) => { const reduced = samples.reduce<{ @@ -771,7 +746,8 @@ export const extractUnexecutedRanges = < const { precedingStateSkipsByEvaluation, unexecutedRanges } = all; const currentEvaluationStartLineAndColumn = `${sample.evaluationRange.startLineNumber},${sample.evaluationRange.startColumn}`; const precedingStateSkips = - precedingStateSkipsByEvaluation[currentEvaluationStartLineAndColumn]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + precedingStateSkipsByEvaluation[currentEvaluationStartLineAndColumn]!; const endsWithSkip = !stateIsExecuting(sample.state); const sampleHasNoExecutedInstructions = endsWithSkip && @@ -807,12 +783,120 @@ export const extractUnexecutedRanges = < ? reduced.unexecutedRanges : reduced.unexecutedRanges.slice(0, -1).reduceRight( (all, range) => { - if (containsRange(all[0], range)) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (containsRange(all[0]!, range)) { return all; } return [range, ...all]; }, - [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]] + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]!] ); return containedRangesExcluded; }; + +/** + * Given a stack, return a summary of the stack's contents, encoding valid VM + * numbers as numbers, and all other stack items as hex literals. + * + * @param stack - a stack of Uint8Array values + */ +export const summarizeStack = (stack: Uint8Array[]) => + stack.map((item) => { + const asNumber = decodeVmNumber(item); + return `0x${binToHex(item)}${ + typeof asNumber === 'string' ? '' : `(${asNumber.toString()})` + }`; + }); + +/** + * Given a debug trace (produced by {@link AuthenticationVirtualMachine.debug}), + * return an array summarizing each step of the trace. Note, debug traces + * include the full program state at the beginning of each evaluation step; the + * summary produced by this method instead shows the resulting stacks after each + * evaluation step. + */ +export const summarizeDebugTrace = < + ProgramState extends AuthenticationProgramStateCommon +>( + trace: ProgramState[] +) => + trace.reduce< + { + alternateStack: string[]; + error?: string; + execute: boolean; + instruction: AuthenticationInstruction | undefined; + ip: number; + stack: string[]; + }[] + >( + // eslint-disable-next-line max-params + (steps, state, stateIndex, states) => { + const nextState = states[stateIndex + 1]; + return nextState === undefined + ? steps + : [ + ...steps, + { + alternateStack: summarizeStack(nextState.alternateStack), + ...(nextState.error === undefined + ? {} + : { error: nextState.error }), + execute: + state.controlStack[state.controlStack.length - 1] !== false, + instruction: state.instructions[state.ip], + ip: state.ip, + stack: summarizeStack(nextState.stack), + }, + ]; + }, + [] + ); + +/** + * Return a string with the result of {@link summarizeDebugTrace} including one + * step per line. + * + * @param summary - a summary produced by {@link summarizeDebugTrace} + */ +export const stringifyDebugTraceSummary = ( + summary: ReturnType, + { + opcodes, + padInstruction, + }: { + /** + * An opcode enum, e.g. {@link OpcodesBCH}. + */ + opcodes: Readonly<{ [opcode: number]: string }>; + /** + * The width of the instruction column. + */ + padInstruction: number; + } = { + opcodes: OpcodesBCH, + padInstruction: 23, + } +) => + summary + .map( + // eslint-disable-next-line complexity + (line) => + `${(line.instruction === undefined + ? '=>' + : `${line.ip}. ${line.execute ? '' : '(skip)'}${ + opcodes[line.instruction.opcode] ?? + `OP_UNKNOWN${line.instruction.opcode}` + }:` + ).padEnd(padInstruction)} ${ + typeof line.error === 'string' + ? line.error + : `${line.stack.join(' ')}${ + line.alternateStack.length === 0 + ? '' + : `| alt: ${line.alternateStack.join(' ')}` + }` + }` + ) + .join('\n'); diff --git a/src/lib/language/language.ts b/src/lib/language/language.ts new file mode 100644 index 00000000..89c8a934 --- /dev/null +++ b/src/lib/language/language.ts @@ -0,0 +1,6 @@ +export * from './compile.js'; +export * from './language-utils.js'; +export * from './language-types.js'; +export * from './parse.js'; +export * from './reduce.js'; +export * from './resolve.js'; diff --git a/src/lib/template/language/parse.spec.ts b/src/lib/language/parse.spec.ts similarity index 99% rename from src/lib/template/language/parse.spec.ts rename to src/lib/language/parse.spec.ts index a8bf34a9..1d21777a 100644 --- a/src/lib/template/language/parse.spec.ts +++ b/src/lib/language/parse.spec.ts @@ -1,7 +1,7 @@ -/* eslint-disable functional/no-expression-statement, max-lines */ +/* eslint-disable max-lines */ import test from 'ava'; -import { parseScript, stringifyTestVector } from '../../lib'; +import { parseScript, stringifyTestVector } from '../lib.js'; test('parseScript: empty string', (t) => { t.deepEqual(parseScript(''), { diff --git a/src/lib/template/language/parse.ts b/src/lib/language/parse.ts similarity index 93% rename from src/lib/template/language/parse.ts rename to src/lib/language/parse.ts index 16db8467..e9cee4a6 100644 --- a/src/lib/template/language/parse.ts +++ b/src/lib/language/parse.ts @@ -1,8 +1,9 @@ -import { ParseResult } from './language-types'; -import { P } from './parsimmon'; +import type { ParseResult } from '../lib'; + +import { P } from './parsimmon.js'; /* eslint-disable sort-keys, @typescript-eslint/naming-convention, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ -const authenticationScriptParser = P.createLanguage({ +const cashAssemblyParser = P.createLanguage({ script: (r) => P.seqMap( P.optWhitespace, @@ -93,4 +94,4 @@ const authenticationScriptParser = P.createLanguage({ /* eslint-enable sort-keys, @typescript-eslint/naming-convention, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ export const parseScript = (script: string) => - authenticationScriptParser.script.parse(script) as ParseResult; + cashAssemblyParser.script.parse(script) as ParseResult; diff --git a/src/lib/template/language/parsimmon.ts b/src/lib/language/parsimmon.ts similarity index 84% rename from src/lib/template/language/parsimmon.ts rename to src/lib/language/parsimmon.ts index 34a330e1..fd609849 100644 --- a/src/lib/template/language/parsimmon.ts +++ b/src/lib/language/parsimmon.ts @@ -2,7 +2,7 @@ * This file is derived from https://github.com/jneen/parsimmon and * https://github.com/DefinitelyTyped/DefinitelyTyped. */ -/* eslint-disable prefer-destructuring, @typescript-eslint/unified-signatures, functional/no-method-signature, functional/no-throw-statement, functional/no-conditional-statement, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, @typescript-eslint/restrict-template-expressions, func-names, @typescript-eslint/init-declarations, new-cap, @typescript-eslint/require-array-sort-compare, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statement, @typescript-eslint/prefer-for-of, @typescript-eslint/restrict-plus-operands, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statement, functional/no-this-expression, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style */ +/* eslint-disable @typescript-eslint/unified-signatures, functional/no-method-signature, functional/no-throw-statement, functional/no-conditional-statement, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, @typescript-eslint/restrict-template-expressions, func-names, @typescript-eslint/init-declarations, new-cap, @typescript-eslint/require-array-sort-compare, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statement, @typescript-eslint/prefer-for-of, @typescript-eslint/restrict-plus-operands, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statement, functional/no-this-expression, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style, @typescript-eslint/no-confusing-void-expression, prefer-arrow-callback, functional/no-return-void, @typescript-eslint/no-unsafe-argument */ // cspell: ignore accum interface Index { @@ -24,7 +24,7 @@ interface Node extends Mark { name: Name; } -type Result = Success | Failure; +type Result = Failure | Success; interface Success { status: true; @@ -57,7 +57,7 @@ interface Parser { many(): Parser; mark(): Parser>; node(name: Name): Parser>; - desc(description: string | string[]): Parser; + desc(description: string[] | string): Parser; sepBy(separator: Parser): Parser; } @@ -299,7 +299,7 @@ _.many = function () { /* istanbul ignore if */ if (i === result.index) { throw new Error( 'infinite loop detected in .many() parser --- calling .many() on ' + - 'a parser which can accept zero characters is usually the cause' + 'a parser that can accept zero characters is usually the cause' ); } i = result.index; @@ -329,18 +329,19 @@ _.skip = function (next: any) { }; _.node = function (name: any) { - return seqMap(index, this, index, function ( - start: any, - value: any, - end: any - ) { - return { - end, - name, - start, - value, - }; - }); + return seqMap( + index, + this, + index, + function (start: any, value: any, end: any) { + return { + end, + name, + start, + value, + }; + } + ); }; _.sepBy = function (separator: any) { @@ -379,7 +380,8 @@ function regexp(re: RegExp, group = 0): Parser { return Parsimmon(function (input: any, i: any) { const match = anchored.exec(input.slice(i)); if (match) { - const fullMatch = match[0]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const fullMatch = match[0]!; const groupMatch = match[group]; return makeSuccess(i + fullMatch.length, groupMatch); } diff --git a/src/lib/template/language/reduce.spec.ts b/src/lib/language/reduce.spec.ts similarity index 86% rename from src/lib/template/language/reduce.spec.ts rename to src/lib/language/reduce.spec.ts index 2af7c5f4..bc81efe8 100644 --- a/src/lib/template/language/reduce.spec.ts +++ b/src/lib/language/reduce.spec.ts @@ -1,7 +1,6 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { reduceScript, stringify } from '../../lib'; +import { reduceScript, stringify } from '../lib.js'; test('reduceScript: does not throw on empty array', (t) => { const reduced = reduceScript([]); @@ -41,7 +40,7 @@ test('reduceScript: resolution error', (t) => { errors: [ { error: - 'Tried to reduce a BTL script with resolution errors: Unknown identifier "unknown".', + 'Tried to reduce a CashAssembly script with resolution errors: Unknown identifier "unknown".', range: { endColumn: 8, endLineNumber: 1, @@ -62,7 +61,7 @@ test('reduceScript: resolution error', (t) => { errors: [ { error: - 'Tried to reduce a BTL script with resolution errors: Unknown identifier "unknown".', + 'Tried to reduce a CashAssembly script with resolution errors: Unknown identifier "unknown".', range: { endColumn: 8, endLineNumber: 1, diff --git a/src/lib/template/language/reduce.ts b/src/lib/language/reduce.ts similarity index 72% rename from src/lib/template/language/reduce.ts rename to src/lib/language/reduce.ts index 45c3abfc..ffae249b 100644 --- a/src/lib/template/language/reduce.ts +++ b/src/lib/language/reduce.ts @@ -1,23 +1,18 @@ -import { flattenBinArray } from '../../format/format'; -import { - AuthenticationErrorCommon, - encodeDataPush, -} from '../../vm/instruction-sets/instruction-sets'; -import { AuthenticationVirtualMachine } from '../../vm/virtual-machine'; -import { +import { flattenBinArray } from '../format/format.js'; +import type { + AuthenticationProgramStateControlStack, AuthenticationProgramStateError, - AuthenticationProgramStateExecutionStack, AuthenticationProgramStateStack, -} from '../../vm/vm-types'; - -import { + AuthenticationVirtualMachine, CompilationError, Range, ResolvedScript, ScriptReductionTraceChildNode, ScriptReductionTraceScriptNode, -} from './language-types'; -import { mergeRanges } from './language-utils'; +} from '../lib'; +import { AuthenticationErrorCommon, encodeDataPush } from '../vm/vm.js'; + +import { mergeRanges } from './language-utils.js'; const emptyReductionTraceNode = (range: Range) => ({ bytecode: Uint8Array.of(), @@ -25,9 +20,9 @@ const emptyReductionTraceNode = (range: Range) => ({ }); /** - * Perform the standard verification of BTL evaluation results. This ensures - * that evaluations complete as expected: if an error occurs while computing an - * evaluation, script compilation should fail. + * Perform the standard verification of CashAssembly evaluation results. This + * ensures that evaluations complete as expected: if an error occurs while + * computing an evaluation, script compilation should fail. * * Three requirements are enforced: * - the evaluation may not produce an `error` @@ -40,18 +35,18 @@ const emptyReductionTraceNode = (range: Range) => ({ * * @param state - the final program state to verify */ -export const verifyBtlEvaluationState = < - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError +export const verifyCashAssemblyEvaluationState = < + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: ProgramState ) => { if (state.error !== undefined) { return state.error; } - if (state.executionStack.length !== 0) { - return AuthenticationErrorCommon.nonEmptyExecutionStack; + if (state.controlStack.length !== 0) { + return AuthenticationErrorCommon.nonEmptyControlStack; } if (state.stack.length !== 1) { return AuthenticationErrorCommon.requiresCleanStack; @@ -63,22 +58,28 @@ export const verifyBtlEvaluationState = < * Reduce a resolved script, returning the resulting bytecode and a trace of the * reduction process. * - * This method will return an error if provided a `resolvedScript` with - * resolution errors. To check for resolution errors, use `getResolutionErrors`. + * This method will return an error if provided a {@link resolvedScript} with + * resolution errors. To check for resolution errors, use + * {@link getResolutionErrors}. * - * @param resolvedScript - the `CompiledScript` to reduce - * @param vm - the `AuthenticationVirtualMachine` to use for evaluations + * @param resolvedScript - the {@link CompiledScript} to reduce + * @param vm - the {@link AuthenticationVirtualMachine} to use for evaluations * @param createEvaluationProgram - a method which accepts the compiled bytecode * of an evaluation and returns the authentication program used to evaluate it */ export const reduceScript = < - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - AuthenticationProgram + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack, + AuthenticationProgram, + ResolvedTransaction >( resolvedScript: ResolvedScript, - vm?: AuthenticationVirtualMachine, + vm?: AuthenticationVirtualMachine< + ResolvedTransaction, + AuthenticationProgram, + ProgramState + >, createEvaluationProgram?: (instructions: Uint8Array) => AuthenticationProgram ): ScriptReductionTraceScriptNode => { const script = resolvedScript.map< @@ -134,9 +135,11 @@ export const reduceScript = < /** * `vm.debug` should always return at least one state. */ - const lastState = trace[trace.length - 1]; - const result = verifyBtlEvaluationState(lastState); - const bytecode = lastState.stack[lastState.stack.length - 1]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const lastState = trace[trace.length - 1]!; + const result = verifyCashAssemblyEvaluationState(lastState); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const bytecode = lastState.stack[lastState.stack.length - 1]!; return { ...(typeof result === 'string' @@ -163,15 +166,15 @@ export const reduceScript = < return { errors: [ { - error: `Tried to reduce a BTL script with resolution errors: ${segment.value}`, + error: `Tried to reduce a CashAssembly script with resolution errors: ${segment.value}`, range: segment.range, }, ], ...emptyReductionTraceNode(segment.range), }; - // eslint-disable-next-line functional/no-conditional-statement + default: - // eslint-disable-next-line functional/no-throw-statement, @typescript-eslint/no-throw-literal, no-throw-literal + // eslint-disable-next-line functional/no-throw-statement, @typescript-eslint/no-throw-literal throw new Error( `"${(segment as { type: string }).type}" is not a known segment type.` ) as never; @@ -204,7 +207,8 @@ export const reduceScript = < bytecode: flattenBinArray(reduction.bytecode), range: mergeRanges( reduction.ranges, - resolvedScript.length === 0 ? undefined : resolvedScript[0].range + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + resolvedScript.length === 0 ? undefined : resolvedScript[0]!.range ), script, }; diff --git a/src/lib/template/language/resolve.spec.ts b/src/lib/language/resolve.spec.ts similarity index 91% rename from src/lib/template/language/resolve.spec.ts rename to src/lib/language/resolve.spec.ts index 589b78c7..a5757096 100644 --- a/src/lib/template/language/resolve.spec.ts +++ b/src/lib/language/resolve.spec.ts @@ -1,13 +1,15 @@ -/* eslint-disable functional/no-expression-statement */ import test from 'ava'; -import { - BtlScriptSegment, +import type { + CashAssemblyScriptSegment, IdentifierResolutionFunction, + ResolvedScript, +} from '../lib'; +import { IdentifierResolutionType, parseScript, resolveScriptSegment, -} from '../../lib'; +} from '../lib.js'; test('resolveScriptSegment: error on unrecognized parse results', (t) => { const segment = { @@ -38,7 +40,7 @@ test('resolveScriptSegment: error on unrecognized parse results', (t) => { value: 'unrecognized_expression', }, ], - } as BtlScriptSegment; + } as CashAssemblyScriptSegment; t.deepEqual( resolveScriptSegment(segment, () => ({ bytecode: Uint8Array.of(), @@ -84,5 +86,5 @@ test('resolveScriptSegment: marks unknown identifier types', (t) => { unknown: 'some_identifier', value: Uint8Array.of(), }, - ] as unknown); + ] as unknown as ResolvedScript); }); diff --git a/src/lib/template/language/resolve.ts b/src/lib/language/resolve.ts similarity index 53% rename from src/lib/template/language/resolve.ts rename to src/lib/language/resolve.ts index 15db0798..a152e509 100644 --- a/src/lib/template/language/resolve.ts +++ b/src/lib/language/resolve.ts @@ -1,27 +1,32 @@ -import { hexToBin, utf8ToBin } from '../../format/format'; -import { bigIntToScriptNumber } from '../../vm/instruction-sets/instruction-sets'; -import { - AnyCompilationEnvironment, +import { hexToBin, utf8ToBin } from '../format/format.js'; +import type { + AnyCompilerConfiguration, + AuthenticationProgramStateControlStack, + AuthenticationProgramStateMinimum, + AuthenticationProgramStateStack, + AuthenticationTemplateVariable, + CashAssemblyScriptSegment, CompilationData, - CompilationEnvironment, + CompilationResultSuccess, + CompilerConfiguration, CompilerOperation, CompilerOperationResult, -} from '../compiler-types'; -import { AuthenticationTemplateVariable } from '../template-types'; - -import { compileScriptRaw } from './compile'; -import { - BtlScriptSegment, - CompilationResultSuccess, - IdentifierResolutionErrorType, IdentifierResolutionFunction, - IdentifierResolutionType, MarkedNode, Range, ResolvedScript, ResolvedSegment, -} from './language-types'; -import { stringifyErrors } from './language-utils'; +} from '../lib'; +import { bigIntToVmNumber } from '../vm/vm.js'; + +import type { CompilationResult } from './language-types.js'; +import { + IdentifierResolutionErrorType, + IdentifierResolutionType, +} from './language-types.js'; +import { getResolutionErrors, stringifyErrors } from './language-utils.js'; +import { parseScript } from './parse.js'; +import { reduceScript } from './reduce.js'; const pluckRange = (node: MarkedNode): Range => ({ endColumn: node.end.column, @@ -34,7 +39,7 @@ const removeNumericSeparators = (numericLiteral: string) => numericLiteral.replace(/_/gu, ''); export const resolveScriptSegment = ( - segment: BtlScriptSegment, + segment: CashAssemblyScriptSegment, resolveIdentifiers: IdentifierResolutionFunction ): ResolvedScript => { // eslint-disable-next-line complexity @@ -98,9 +103,7 @@ export const resolveScriptSegment = ( literalType: 'BigIntLiteral' as const, range, type: 'bytecode' as const, - value: bigIntToScriptNumber( - BigInt(removeNumericSeparators(child.value)) - ), + value: bigIntToVmNumber(BigInt(removeNumericSeparators(child.value))), }; case 'BinaryLiteral': return { @@ -108,7 +111,7 @@ export const resolveScriptSegment = ( literalType: 'BinaryLiteral' as const, range, type: 'bytecode' as const, - value: bigIntToScriptNumber( + value: bigIntToVmNumber( BigInt(`0b${removeNumericSeparators(child.value)}`) ), }; @@ -155,11 +158,11 @@ export enum BuiltInVariables { } const attemptCompilerOperation = < - TransactionContext, - Environment extends AnyCompilationEnvironment + CompilationContext, + Configuration extends AnyCompilerConfiguration >({ data, - environment, + configuration, identifier, matchingOperations, operationExample = 'operation_identifier', @@ -167,14 +170,12 @@ const attemptCompilerOperation = < variableId, variableType, }: { - data: CompilationData; - environment: Environment; + data: CompilationData; + configuration: Configuration; identifier: string; matchingOperations: - | { - [x: string]: CompilerOperation | undefined; - } - | CompilerOperation + | CompilerOperation + | { [x: string]: CompilerOperation | undefined } | undefined; operationId: string | undefined; variableId: string; @@ -189,7 +190,7 @@ const attemptCompilerOperation = < } if (typeof matchingOperations === 'function') { const operation = matchingOperations; - return operation(identifier, data, environment); + return operation(identifier, data, configuration); } if (operationId === undefined) { return { @@ -197,20 +198,18 @@ const attemptCompilerOperation = < status: 'error', }; } - const operation = (matchingOperations as { - [x: string]: CompilerOperation | undefined; - })[operationId]; + const operation = matchingOperations[operationId]; if (operation === undefined) { return { error: `The identifier "${identifier}" could not be resolved because the "${variableId}.${operationId}" operation is not available to this compiler.`, status: 'error', }; } - return operation(identifier, data, environment); + return operation(identifier, data, configuration); }; /** - * If the identifer can be successfully resolved as a variable, the result is + * If the identifier can be successfully resolved as a variable, the result is * returned as a Uint8Array. If the identifier references a known variable, but * an error occurs in resolving it, the error is returned as a string. * Otherwise, the identifier is not recognized as a variable, and this method @@ -218,19 +217,20 @@ const attemptCompilerOperation = < * * @param identifier - The full identifier used to describe this operation, e.g. * `owner.signature.all_outputs`. - * @param data - The `CompilationData` provided to the compiler - * @param environment - The `CompilationEnvironment` provided to the compiler + * @param data - The {@link CompilationData} provided to the compiler + * @param configuration - The {@link CompilerConfiguration} provided to + * the compiler */ export const resolveVariableIdentifier = < - TransactionContext, - Environment extends AnyCompilationEnvironment + CompilationContext, + Environment extends AnyCompilerConfiguration >({ data, - environment, + configuration, identifier, }: { - data: CompilationData; - environment: Environment; + data: CompilationData; + configuration: Environment; identifier: string; }): CompilerOperationResult => { const [variableId, operationId] = identifier.split('.') as [ @@ -241,30 +241,30 @@ export const resolveVariableIdentifier = < switch (variableId) { case BuiltInVariables.currentBlockHeight: return attemptCompilerOperation({ + configuration, data, - environment, identifier, - matchingOperations: environment.operations?.currentBlockHeight, + matchingOperations: configuration.operations?.currentBlockHeight, operationId, variableId, variableType: 'currentBlockHeight', }); case BuiltInVariables.currentBlockTime: return attemptCompilerOperation({ + configuration, data, - environment, identifier, - matchingOperations: environment.operations?.currentBlockTime, + matchingOperations: configuration.operations?.currentBlockTime, operationId, variableId, variableType: 'currentBlockTime', }); case BuiltInVariables.signingSerialization: return attemptCompilerOperation({ + configuration, data, - environment, identifier, - matchingOperations: environment.operations?.signingSerialization, + matchingOperations: configuration.operations?.signingSerialization, operationExample: 'version', operationId, variableId, @@ -272,38 +272,38 @@ export const resolveVariableIdentifier = < }); default: { const expectedVariable: AuthenticationTemplateVariable | undefined = - environment.variables?.[variableId]; + configuration.variables?.[variableId]; if (expectedVariable === undefined) { return { status: 'skip' }; } return attemptCompilerOperation({ + configuration, data, - environment, identifier, operationId, variableId, ...{ // eslint-disable-next-line @typescript-eslint/naming-convention AddressData: { - matchingOperations: environment.operations?.addressData, + matchingOperations: configuration.operations?.addressData, variableType: 'addressData', }, // eslint-disable-next-line @typescript-eslint/naming-convention HdKey: { - matchingOperations: environment.operations?.hdKey, + matchingOperations: configuration.operations?.hdKey, operationExample: 'public_key', variableType: 'hdKey', }, // eslint-disable-next-line @typescript-eslint/naming-convention Key: { - matchingOperations: environment.operations?.key, + matchingOperations: configuration.operations?.key, operationExample: 'public_key', variableType: 'key', }, // eslint-disable-next-line @typescript-eslint/naming-convention WalletData: { - matchingOperations: environment.operations?.walletData, + matchingOperations: configuration.operations?.walletData, variableType: 'walletData', }, }[expectedVariable.type], @@ -312,37 +312,144 @@ export const resolveVariableIdentifier = < } }; +/** + * A text-formatting method to pretty-print the list of expected inputs + * (`Encountered unexpected input while parsing script. Expected ...`). If + * present, the `EOF` expectation is always moved to the end of the list. + * @param expectedArray - the alphabetized list of expected inputs produced by + * `parseScript` + */ +export const describeExpectedInput = (expectedArray: string[]) => { + /** + * The constant used by the parser to denote the end of the input + */ + const EOF = 'EOF'; + const newArray = expectedArray.filter((value) => value !== EOF); + // eslint-disable-next-line functional/no-conditional-statement + if (newArray.length !== expectedArray.length) { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + newArray.push('the end of the script'); + } + const withoutLastElement = newArray.slice(0, newArray.length - 1); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const lastElement = newArray[newArray.length - 1]!; + const arrayRequiresCommas = 3; + const arrayRequiresOr = 2; + return `Encountered unexpected input while parsing script. Expected ${ + newArray.length >= arrayRequiresCommas + ? withoutLastElement.join(', ').concat(`, or ${lastElement}`) + : newArray.length === arrayRequiresOr + ? newArray.join(' or ') + : lastElement + }.`; +}; + +export const createEmptyRange = () => ({ + endColumn: 0, + endLineNumber: 0, + startColumn: 0, + startLineNumber: 0, +}); + +/** + * This method is generally for internal use. The {@link compileScript} method + * is the recommended API for direct compilation. + */ +export const compileScriptRaw = < + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack, + CompilationContext = unknown +>({ + data, + configuration, + scriptId, +}: { + data: CompilationData; + configuration: CompilerConfiguration; + scriptId: string; +}): CompilationResult => { + const script = configuration.scripts[scriptId]; + if (script === undefined) { + return { + errorType: 'parse', + errors: [ + { + error: `No script with an ID of "${scriptId}" was provided in the compiler configuration.`, + range: createEmptyRange(), + }, + ], + success: false, + }; + } + + if (configuration.sourceScriptIds?.includes(scriptId) === true) { + return { + errorType: 'parse', + errors: [ + { + error: `A circular dependency was encountered: script "${scriptId}" relies on itself to be generated. (Source scripts: ${configuration.sourceScriptIds.join( + ' → ' + )})`, + range: createEmptyRange(), + }, + ], + success: false, + }; + } + const sourceScriptIds = + configuration.sourceScriptIds === undefined + ? [scriptId] + : [...configuration.sourceScriptIds, scriptId]; + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + return compileScriptContents({ + configuration: { ...configuration, sourceScriptIds }, + data, + script, + }); +}; + /** * Compile an internal script identifier. * * @remarks - * If the identifer can be successfully resolved as a script, the script is - * compiled and returned as a CompilationResultSuccess. If an error occurs in - * compiling it, the error is returned as a string. + * If the identifier can be successfully resolved as a script, the script is + * compiled and returned as a {@link CompilationResultSuccess}. If an error + * occurs in compiling it, the error is returned as a string. * * Otherwise, the identifier is not recognized as a script, and this method * simply returns `false`. - * - * @param identifier - the identifier of the script to be resolved - * @param data - the provided CompilationData - * @param environment - the provided CompilationEnvironment - * @param parentIdentifier - the identifier of the script which references the - * script being resolved (for detecting circular dependencies) */ -export const resolveScriptIdentifier = ({ +export const resolveScriptIdentifier = ({ data, - environment, + configuration, identifier, }: { + /** + * The identifier of the script to be resolved + */ identifier: string; - data: CompilationData; - environment: CompilationEnvironment; + /** + * The provided {@link CompilationData} + */ + data: CompilationData; + /** + * the provided {@link CompilerConfiguration} + */ + configuration: CompilerConfiguration; }): CompilationResultSuccess | string | false => { - if ((environment.scripts[identifier] as string | undefined) === undefined) { + if (configuration.scripts[identifier] === undefined) { return false; } - const result = compileScriptRaw({ data, environment, scriptId: identifier }); + const result = compileScriptRaw({ + configuration, + data, + scriptId: identifier, + }); if (result.success) { return result; } @@ -350,41 +457,35 @@ export const resolveScriptIdentifier = ({ return `Compilation error in resolved script "${identifier}": ${stringifyErrors( result.errors )}`; - - /* - * result.errors.reduce( - * (all, { error, range }) => - * `${ - * all === '' ? '' : `${all}; ` - * } [${ - * range.startLineNumber - * }, ${range.startColumn}]: ${error}`, - * '' - * ); - */ }; /** - * Return an `IdentifierResolutionFunction` for use in `resolveScriptSegment`. + * Return an {@link IdentifierResolutionFunction} for use in + * {@link resolveScriptSegment}. * * @param scriptId - the `id` of the script for which the resulting * `IdentifierResolutionFunction` will be used. - * @param environment - a snapshot of the context around `scriptId`. See - * `CompilationEnvironment` for details. - * @param data - the actual variable values (private keys, shared wallet data, - * shared address data, etc.) to use in resolving variables. */ -export const createIdentifierResolver = ({ - data, - environment, -}: { - data: CompilationData; - environment: CompilationEnvironment; -}): IdentifierResolutionFunction => +export const createIdentifierResolver = + ({ + data, + configuration, + }: { + /** + * The actual variable values (private keys, shared wallet data, shared + * address data, etc.) to use in resolving variables. + */ + data: CompilationData; + /** + * A snapshot of the configuration around `scriptId`, see + * {@link CompilerConfiguration} for details + */ + configuration: CompilerConfiguration; + }): IdentifierResolutionFunction => // eslint-disable-next-line complexity (identifier: string): ReturnType => { const opcodeResult: Uint8Array | undefined = - environment.opcodes?.[identifier]; + configuration.opcodes?.[identifier]; if (opcodeResult !== undefined) { return { bytecode: opcodeResult, @@ -393,8 +494,8 @@ export const createIdentifierResolver = ({ }; } const variableResult = resolveVariableIdentifier({ + configuration, data, - environment, identifier, }); if (variableResult.status !== 'skip') { @@ -404,11 +505,12 @@ export const createIdentifierResolver = ({ ? { debug: variableResult.debug } : {}), error: variableResult.error, - ...(environment.entityOwnership === undefined + ...(configuration.entityOwnership === undefined ? {} : { entityOwnership: - environment.entityOwnership[identifier.split('.')[0]], + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + configuration.entityOwnership[identifier.split('.')[0]!], }), recoverable: 'recoverable' in variableResult, status: false, @@ -429,8 +531,8 @@ export const createIdentifierResolver = ({ }; } const scriptResult = resolveScriptIdentifier({ + configuration, data, - environment, identifier, }); if (scriptResult !== false) { @@ -454,3 +556,66 @@ export const createIdentifierResolver = ({ type: IdentifierResolutionErrorType.unknown, }; }; + +/** + * This method is generally for internal use. The {@link compileScript} method + * is the recommended API for direct compilation. + */ +export const compileScriptContents = < + ProgramState extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & + AuthenticationProgramStateStack, + CompilationContext = unknown +>({ + data, + configuration, + script, +}: { + script: string; + data: CompilationData; + configuration: CompilerConfiguration; +}): CompilationResult => { + const parseResult = parseScript(script); + if (!parseResult.status) { + return { + errorType: 'parse', + errors: [ + { + error: describeExpectedInput(parseResult.expected), + range: { + endColumn: parseResult.index.column, + endLineNumber: parseResult.index.line, + startColumn: parseResult.index.column, + startLineNumber: parseResult.index.line, + }, + }, + ], + success: false, + }; + } + const resolver = createIdentifierResolver({ configuration, data }); + const resolvedScript = resolveScriptSegment(parseResult.value, resolver); + const resolutionErrors = getResolutionErrors(resolvedScript); + if (resolutionErrors.length !== 0) { + return { + errorType: 'resolve', + errors: resolutionErrors, + parse: parseResult.value, + resolve: resolvedScript, + success: false, + }; + } + const reduction = reduceScript( + resolvedScript, + configuration.vm, + configuration.createAuthenticationProgram + ); + return { + ...(reduction.errors === undefined + ? { bytecode: reduction.bytecode, success: true } + : { errorType: 'reduce', errors: reduction.errors, success: false }), + parse: parseResult.value, + reduce: reduction, + resolve: resolvedScript, + }; +}; diff --git a/src/lib/lib.ts b/src/lib/lib.ts index bccd97ae..24fe911c 100644 --- a/src/lib/lib.ts +++ b/src/lib/lib.ts @@ -1,8 +1,12 @@ -export * from './address/address'; -export * from './vm/vm'; -export * from './bin/bin'; -export * from './crypto/crypto'; -export * from './key/key'; -export * from './template/template'; -export * from './transaction/transaction'; -export * from './format/format'; +export * from './address/address.js'; +export * from './bin/bin.js'; +export * from './crypto/crypto.js'; +export * from './format/format.js'; +export * from './key/key.js'; +export * from './language/language.js'; +export * from './message/message.js'; +export * from './schema/schema.js'; +export * from './compiler/compiler.js'; +export * from './transaction/transaction.js'; +export * from './vm/vm.js'; +export * from './vmb-tests/vmb-tests.js'; diff --git a/src/lib/mappings.spec.ts b/src/lib/mappings.spec.ts new file mode 100644 index 00000000..343beb9f --- /dev/null +++ b/src/lib/mappings.spec.ts @@ -0,0 +1,115 @@ +/** + * Libauth is designed to simultaneously support multiple chains/versions of + * bitcoin without patches to the Libauth codebase. As such, Libauth can + * potentially include support for multiple implementations of a particular data + * structure. By convention, Libauth identifies chain-specific implementations + * with an uppercase currency symbol suffix. + * + * For example, a "transaction" may include different properties depending on + * the chain for which it is created. The type {@link TransactionBCH} specifies + * a transaction intended for the BCH network, while the type + * {@link TransactionBTC} specifies a transaction intended for BTC. + * + * For convenience, unless another chain is specified, Libauth types refer to + * their BCH implementation, e.g. {@link Transaction} is an alias for + * {@link TransactionBCH}. + * + * This file tests these default mappings. + */ + +import test from 'ava'; + +import type { + AssertTypesEqual, + AuthenticationProgram, + AuthenticationProgramBCH, + AuthenticationProgramCommon, + AuthenticationProgramStateBCH, + AuthenticationProgramStateCommon, + ResolvedTransaction, + ResolvedTransactionBCH, + ResolvedTransactionCommon, + Transaction, + TransactionBCH, + TransactionCommon, +} from './lib'; +import { + AuthenticationErrorBCH, + AuthenticationErrorBCH2022, + cloneAuthenticationProgramState, + cloneAuthenticationProgramStateBCH, + cloneAuthenticationProgramStateCommon, + compilerConfigurationToCompiler, + compilerConfigurationToCompilerBCH, + ConsensusBCH, + ConsensusCommon, + createCompiler, + createCompilerBCH, + createInstructionSetBCH, + createInstructionSetBCH2022, + createVirtualMachineBCH, + createVirtualMachineBCH2022, + decodeTransaction, + decodeTransactionBCH, + decodeTransactionCommon, + decodeTransactionUnsafe, + decodeTransactionUnsafeBCH, + decodeTransactionUnsafeCommon, + encodeTransaction, + encodeTransactionBCH, + encodeTransactionCommon, + OpcodeDescriptions, + OpcodeDescriptionsBCH, + OpcodeDescriptionsBCH2022, + Opcodes, + OpcodesBCH, + OpcodesBCH2022, +} from './lib.js'; + +type TypeTests = + | AssertTypesEqual< + AuthenticationProgramStateBCH, + AuthenticationProgramStateCommon + > + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual + | AssertTypesEqual; +// TODO: AssertTypesEqual` + +test('Libauth exposes all expected mappings', (t) => { + const testTypes: TypeTests = true; + t.true(testTypes); + t.deepEqual(AuthenticationErrorBCH2022, AuthenticationErrorBCH); + t.deepEqual( + cloneAuthenticationProgramStateCommon, + cloneAuthenticationProgramStateBCH + ); + t.deepEqual( + cloneAuthenticationProgramState, + cloneAuthenticationProgramStateBCH + ); + t.deepEqual( + compilerConfigurationToCompilerBCH, + compilerConfigurationToCompiler + ); + t.deepEqual(createInstructionSetBCH2022, createInstructionSetBCH); + t.deepEqual(createVirtualMachineBCH2022, createVirtualMachineBCH); + t.deepEqual(ConsensusCommon, ConsensusBCH); + t.deepEqual(createCompilerBCH, createCompiler); + t.deepEqual(decodeTransactionCommon, decodeTransactionBCH); + t.deepEqual(decodeTransaction, decodeTransactionBCH); + t.deepEqual(decodeTransactionUnsafeCommon, decodeTransactionUnsafeBCH); + t.deepEqual(decodeTransactionUnsafe, decodeTransactionUnsafeBCH); + t.deepEqual(encodeTransactionCommon, encodeTransactionBCH); + t.deepEqual(encodeTransaction, encodeTransactionBCH); + t.deepEqual(OpcodeDescriptionsBCH2022, OpcodeDescriptionsBCH); + t.deepEqual(OpcodeDescriptionsBCH, OpcodeDescriptions); + t.deepEqual(OpcodesBCH2022, OpcodesBCH); + t.deepEqual(Opcodes, OpcodesBCH); +}); diff --git a/src/lib/message/message.ts b/src/lib/message/message.ts new file mode 100644 index 00000000..1af9c158 --- /dev/null +++ b/src/lib/message/message.ts @@ -0,0 +1,2 @@ +export * from './transaction-encoding.js'; +export * from './transaction-types.js'; diff --git a/src/lib/transaction/transaction-serialization.spec.ts b/src/lib/message/transaction-encoding.spec.ts similarity index 71% rename from src/lib/transaction/transaction-serialization.spec.ts rename to src/lib/message/transaction-encoding.spec.ts index 086c8a8a..1c85899d 100644 --- a/src/lib/transaction/transaction-serialization.spec.ts +++ b/src/lib/message/transaction-encoding.spec.ts @@ -1,20 +1,17 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; +import type { TransactionCommon } from '../lib'; import { bigIntToBinUint64LE, - decodeTransaction, - encodeTransaction, - getTransactionHash, - getTransactionHashBE, - getTransactionHashLE, + decodeTransactionCommon, + encodeTransactionCommon, + hashTransaction, + hashTransactionP2pOrder, + hashTransactionUiOrder, hexToBin, - instantiateSha256, - Transaction, + sha256, TransactionDecodingError, -} from '../lib'; - -const sha256Promise = instantiateSha256(); +} from '../lib.js'; test('decodeTransaction', (t) => { /** @@ -78,7 +75,7 @@ test('decodeTransaction', (t) => { const tx = hexToBin( '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' ); - t.deepEqual(decodeTransaction(tx), { + t.deepEqual(decodeTransactionCommon(tx), { inputs: [ { outpointIndex: 3, @@ -117,19 +114,19 @@ test('decodeTransaction', (t) => { outputs: [ { lockingBytecode: hexToBin('6552'), - satoshis: bigIntToBinUint64LE(BigInt(73134625)), + valueSatoshis: bigIntToBinUint64LE(BigInt(73134625)), }, { lockingBytecode: hexToBin('5253516a656a53'), - satoshis: bigIntToBinUint64LE(BigInt(95890937)), + valueSatoshis: bigIntToBinUint64LE(BigInt(95890937)), }, { lockingBytecode: hexToBin(''), - satoshis: bigIntToBinUint64LE(BigInt(17344964)), + valueSatoshis: bigIntToBinUint64LE(BigInt(17344964)), }, { lockingBytecode: hexToBin('52525251516a'), - satoshis: bigIntToBinUint64LE(BigInt(19470773)), + valueSatoshis: bigIntToBinUint64LE(BigInt(19470773)), }, ], version: 1886435390, @@ -176,25 +173,25 @@ test('encodeTransaction', (t) => { outputs: [ { lockingBytecode: hexToBin('6552'), - satoshis: bigIntToBinUint64LE(BigInt(73134625)), + valueSatoshis: bigIntToBinUint64LE(BigInt(73134625)), }, { lockingBytecode: hexToBin('5253516a656a53'), - satoshis: bigIntToBinUint64LE(BigInt(95890937)), + valueSatoshis: bigIntToBinUint64LE(BigInt(95890937)), }, { lockingBytecode: hexToBin(''), - satoshis: bigIntToBinUint64LE(BigInt(17344964)), + valueSatoshis: bigIntToBinUint64LE(BigInt(17344964)), }, { lockingBytecode: hexToBin('52525251516a'), - satoshis: bigIntToBinUint64LE(BigInt(19470773)), + valueSatoshis: bigIntToBinUint64LE(BigInt(19470773)), }, ], version: 1886435390, }; t.deepEqual( - encodeTransaction(tx), + encodeTransactionCommon(tx), hexToBin( '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' ) @@ -206,27 +203,50 @@ test('decode and encode transaction', (t) => { '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38'; t.deepEqual( hexToBin(tx), - encodeTransaction(decodeTransaction(hexToBin(tx)) as Transaction) + encodeTransactionCommon( + decodeTransactionCommon(hexToBin(tx)) as TransactionCommon + ) ); }); test('decodeTransaction: invalid', (t) => { t.deepEqual( - decodeTransaction(hexToBin('00')), + decodeTransactionCommon(hexToBin('00')), TransactionDecodingError.invalidFormat ); }); -test('getTransactionHash, getTransactionHashBE, getTransactionHashLE', async (t) => { - const sha256 = await sha256Promise; +test('hashTransaction, hashTransactionUiOrder, hashTransactionP2pOrder', (t) => { const tx = '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38'; - const txid = - 'fbc40e8ef481fa11e5ffd2477a28297bcceab8bed0d28405774e372b4ffead67'; - t.deepEqual(getTransactionHash(sha256, hexToBin(tx)), txid); - t.deepEqual(getTransactionHashBE(sha256, hexToBin(tx)), hexToBin(txid)); + const txId = + '67adfe4f2b374e770584d2d0beb8eacc7b29287a47d2ffe511fa81f48e0ec4fb'; + const halTx = + '0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000'; + const halTxId = + 'f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16'; + + t.deepEqual(hashTransaction(hexToBin(tx)), txId); + t.deepEqual(hashTransactionUiOrder(hexToBin(tx)), hexToBin(txId)); + t.deepEqual(hashTransactionUiOrder(hexToBin(tx), sha256), hexToBin(txId)); + t.deepEqual(hashTransactionP2pOrder(hexToBin(tx)), hexToBin(txId).reverse()); + t.deepEqual( + hashTransactionP2pOrder(hexToBin(tx), sha256), + hexToBin(txId).reverse() + ); + + t.deepEqual(hashTransaction(hexToBin(halTx)), halTxId); + t.deepEqual(hashTransactionUiOrder(hexToBin(halTx)), hexToBin(halTxId)); + t.deepEqual( + hashTransactionUiOrder(hexToBin(halTx), sha256), + hexToBin(halTxId) + ); + t.deepEqual( + hashTransactionP2pOrder(hexToBin(halTx)), + hexToBin(halTxId).reverse() + ); t.deepEqual( - getTransactionHashLE(sha256, hexToBin(tx)), - hexToBin(txid).reverse() + hashTransactionP2pOrder(hexToBin(halTx), sha256), + hexToBin(halTxId).reverse() ); }); diff --git a/src/lib/message/transaction-encoding.ts b/src/lib/message/transaction-encoding.ts new file mode 100644 index 00000000..2aacc6c7 --- /dev/null +++ b/src/lib/message/transaction-encoding.ts @@ -0,0 +1,426 @@ +import { sha256 as internalSha256 } from '../crypto/default-crypto-instances.js'; +import { + bigIntToVarInt, + binToHex, + binToNumberUint32LE, + decodeVarInt, + flattenBinArray, + numberToBinUint32LE, +} from '../format/format.js'; +import type { Input, Output, Sha256, TransactionCommon } from '../lib'; + +/** + * Encode a single input for inclusion in an encoded transaction. + * + * @param input - the input to encode + */ +export const encodeTransactionInput = (input: Input) => + flattenBinArray([ + input.outpointTransactionHash.slice().reverse(), + numberToBinUint32LE(input.outpointIndex), + bigIntToVarInt(BigInt(input.unlockingBytecode.length)), + input.unlockingBytecode, + numberToBinUint32LE(input.sequenceNumber), + ]); + +/** + * Decode a transaction {@link Input} from a Uint8Array containing the encoded + * transaction input beginning at `index`. + * + * Note: this method throws runtime errors when attempting to decode an + * improperly-encoded input. + * + * @param bin - the raw transaction from which to read the input + * @param index - the index at which the input begins + */ +export const decodeTransactionInputUnsafe = ( + bin: Uint8Array, + index: number +) => { + const sha256HashBytes = 32; + const uint32Bytes = 4; + const indexAfterTxHash = index + sha256HashBytes; + const outpointTransactionHash = bin.slice(index, indexAfterTxHash).reverse(); + const indexAfterOutpointIndex = indexAfterTxHash + uint32Bytes; + const outpointIndex = binToNumberUint32LE( + bin.subarray(indexAfterTxHash, indexAfterOutpointIndex) + ); + const { nextIndex: indexAfterBytecodeLength, value: bytecodeLength } = + decodeVarInt(bin, indexAfterOutpointIndex); + const indexAfterBytecode = indexAfterBytecodeLength + Number(bytecodeLength); + const unlockingBytecode = bin.slice( + indexAfterBytecodeLength, + indexAfterBytecode + ); + const nextIndex = indexAfterBytecode + uint32Bytes; + const sequenceNumber = binToNumberUint32LE( + bin.subarray(indexAfterBytecode, nextIndex) + ); + return { + input: { + outpointIndex, + outpointTransactionHash, + sequenceNumber, + unlockingBytecode, + }, + nextIndex, + }; +}; + +/** + * Encode a set of {@link Input}s for inclusion in an encoded transaction + * including the prefixed number of inputs. + * + * Format: [VarInt: input count] [encoded inputs] + * + * @param inputs - the set of inputs to encode + */ +export const encodeTransactionInputs = (inputs: readonly Input[]) => + flattenBinArray([ + bigIntToVarInt(BigInt(inputs.length)), + ...inputs.map(encodeTransactionInput), + ]); + +/** + * Decode an array of items following a VarInt (see {@link decodeVarInt}). A + * VarInt will be read beginning at `index`, and then the encoded number of + * items will be decoded using `itemDecoder`. + * + * Note: the decoder produced by this method throws runtime errors when + * attempting to decode improperly-encoded items. + * + * @param itemDecoder - a function used to decode each encoded item + */ +export const createVarIntItemUnsafeDecoder = + ( + key: Key, + itemDecoder: ( + bin: Uint8Array, + index: number + ) => { [key in Key]: Item } & { nextIndex: number }, + keyPlural: KeyPlural + ) => + (bin: Uint8Array, index = 0) => { + const { nextIndex: indexAfterItemCount, value: itemCount } = decodeVarInt( + bin, + index + ); + // eslint-disable-next-line functional/no-let + let cursor = indexAfterItemCount; + const items = []; + // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + for (let i = 0; i < Number(itemCount); i++) { + // const { [key]: item, nextIndex } = itemDecoder(bin, cursor); + const result = itemDecoder(bin, cursor); + const item = result[key]; + // eslint-disable-next-line functional/no-expression-statement + cursor = result.nextIndex; + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + items.push(item); + } + return { [keyPlural]: items, nextIndex: cursor } as { + [key in KeyPlural]: Item[]; + } & { nextIndex: number }; + }; + +/** + * Decode a set of transaction {@link Input}s from a Uint8Array beginning at + * `index`. A VarInt will be read beginning at `index`, and then the encoded + * number of transaction inputs will be decoded and returned. + * + * Note: this method throws runtime errors when attempting to decode + * improperly-encoded sets of inputs. + * + * @param bin - the raw transaction from which to read the inputs + * @param index - the index at which the VarInt count begins + */ +export const decodeTransactionInputsUnsafe = createVarIntItemUnsafeDecoder( + 'input', + decodeTransactionInputUnsafe, + 'inputs' +) as ( + bin: Uint8Array, + index?: number +) => { + inputs: { + outpointIndex: number; + outpointTransactionHash: Uint8Array; + sequenceNumber: number; + unlockingBytecode: Uint8Array; + }[]; + nextIndex: number; +}; + +/** + * Decode a transaction {@link Output} from a Uint8Array containing the encoded + * transaction output beginning at `index`. + * + * Note: this method throws runtime errors when attempting to decode an + * improperly-encoded output. + * + * @param bin - the raw transaction from which to read the output + * @param index - the index at which the output begins + */ +export const decodeTransactionOutputUnsafe = ( + bin: Uint8Array, + index: number +) => { + const uint64Bytes = 8; + const indexAfterSatoshis = index + uint64Bytes; + const valueSatoshis = bin.slice(index, indexAfterSatoshis); + const { nextIndex: indexAfterScriptLength, value } = decodeVarInt( + bin, + indexAfterSatoshis + ); + const bytecodeLength = Number(value); + const nextIndex = indexAfterScriptLength + bytecodeLength; + const lockingBytecode = + bytecodeLength === 0 + ? new Uint8Array() + : bin.slice(indexAfterScriptLength, nextIndex); + + return { + nextIndex, + output: { + lockingBytecode, + valueSatoshis, + }, + }; +}; + +/** + * Encode a single {@link Output} for inclusion in an encoded transaction. + * + * @param output - the output to encode + */ +export const encodeTransactionOutput = (output: Output) => + flattenBinArray([ + output.valueSatoshis, + bigIntToVarInt(BigInt(output.lockingBytecode.length)), + output.lockingBytecode, + ]); + +/** + * Decode a set of transaction {@link Output}s from a Uint8Array beginning at + * `index`. A VarInt will be read beginning at `index`, and then the encoded + * number of transaction outputs will be decoded and returned. + * + * Note: this method throws runtime errors when attempting to decode + * improperly-encoded sets of outputs. + * + * @param bin - the raw transaction from which to read the outputs + * @param index - the index at which the VarInt count begins + */ +export const decodeTransactionOutputsUnsafe = createVarIntItemUnsafeDecoder( + 'output', + decodeTransactionOutputUnsafe, + 'outputs' +) as ( + bin: Uint8Array, + index?: number +) => { + outputs: { + lockingBytecode: Uint8Array; + valueSatoshis: Uint8Array; + }[]; + nextIndex: number; +}; + +/** + * Encode a set of {@link Output}s for inclusion in an encoded transaction + * including the prefixed number of outputs. Note, this encoding differs from + * {@link encodeTransactionOutputsForSigning} (used for signing serializations). + * + * Format: [VarInt: output count] [encoded outputs] + * + * @param outputs - the set of outputs to encode + */ +export const encodeTransactionOutputs = (outputs: readonly Output[]) => + flattenBinArray([ + bigIntToVarInt(BigInt(outputs.length)), + ...outputs.map(encodeTransactionOutput), + ]); + +/** + * Decode a `Uint8Array` using the version 1 or 2 raw transaction format. + * + * Note: this method throws runtime errors when attempting to decode messages + * which do not properly follow the transaction format. If the input is + * untrusted, use {@link decodeTransaction}. + * + * @param bin - the raw message to decode + */ +export const decodeTransactionUnsafeCommon = ( + bin: Uint8Array +): TransactionCommon => { + const uint32Bytes = 4; + const version = binToNumberUint32LE(bin.subarray(0, uint32Bytes)); + const indexAfterVersion = uint32Bytes; + const { inputs, nextIndex: indexAfterInputs } = decodeTransactionInputsUnsafe( + bin, + indexAfterVersion + ); + const { outputs, nextIndex: indexAfterOutputs } = + decodeTransactionOutputsUnsafe(bin, indexAfterInputs); + const locktime = binToNumberUint32LE( + bin.subarray(indexAfterOutputs, indexAfterOutputs + uint32Bytes) + ); + return { + inputs, + locktime, + outputs, + version, + }; +}; +export const decodeTransactionUnsafeBCH = decodeTransactionUnsafeCommon; +export const decodeTransactionUnsafe = decodeTransactionUnsafeBCH; + +export enum TransactionDecodingError { + invalidFormat = 'Transaction decoding error: message does not follow the version 1 or version 2 transaction format.', +} + +/** + * Decode a `Uint8Array` using the version 1 or 2 raw transaction format. + * + * @param bin - the raw message to decode + */ +export const decodeTransactionCommon = (bin: Uint8Array) => { + // eslint-disable-next-line functional/no-try-statement + try { + return decodeTransactionUnsafeCommon(bin); + } catch { + return TransactionDecodingError.invalidFormat; + } +}; +export const decodeTransactionBCH = decodeTransactionCommon; +export const decodeTransaction = decodeTransactionBCH; + +/** + * Encode a {@link Transaction} using the standard P2P network format. This + * serialization is also used when computing the transaction's hash (A.K.A. + * "transaction ID" or "TXID"). + */ +export const encodeTransactionCommon = (tx: TransactionCommon) => + flattenBinArray([ + numberToBinUint32LE(tx.version), + encodeTransactionInputs(tx.inputs), + encodeTransactionOutputs(tx.outputs), + numberToBinUint32LE(tx.locktime), + ]); +export const encodeTransactionBCH = encodeTransactionCommon; +export const encodeTransaction = encodeTransactionBCH; + +export const cloneTransactionInputsCommon = < + Transaction extends TransactionCommon +>( + inputs: Readonly['inputs'] +) => + inputs.map((input) => ({ + outpointIndex: input.outpointIndex, + outpointTransactionHash: input.outpointTransactionHash.slice(), + sequenceNumber: input.sequenceNumber, + unlockingBytecode: input.unlockingBytecode.slice(), + })); + +export const cloneTransactionOutputsCommon = < + Transaction extends TransactionCommon +>( + outputs: Readonly['outputs'] +) => + outputs.map((output) => ({ + lockingBytecode: output.lockingBytecode.slice(), + valueSatoshis: output.valueSatoshis.slice(), + })); + +export const cloneTransactionCommon = ( + transaction: Readonly +) => ({ + inputs: cloneTransactionInputsCommon(transaction.inputs), + locktime: transaction.locktime, + outputs: cloneTransactionOutputsCommon(transaction.outputs), + version: transaction.version, +}); + +/** + * Compute a transaction hash (A.K.A. "transaction ID" or "TXID") from an + * encoded transaction in P2P network message order. This is the byte order + * produced by most sha256 libraries and used in most P2P network messages. It + * is also the byte order produced by `OP_SHA256` and `OP_HASH256` in the + * virtual machine. + * + * @returns the transaction hash in P2P network message byte order + * + * @param transaction - the encoded transaction + * @param sha256 - an implementation of sha256 + */ +export const hashTransactionP2pOrder = ( + transaction: Uint8Array, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => sha256.hash(sha256.hash(transaction)); + +/** + * Compute a transaction hash (A.K.A. "transaction ID" or "TXID") from an + * encoded transaction in user interface byte order. This is the byte order + * typically used by block explorers, wallets, and other user interfaces. + * + * @returns the transaction hash in User Interface byte order + * + * @param transaction - the encoded transaction + * @param sha256 - an implementation of sha256 + */ +export const hashTransactionUiOrder = ( + transaction: Uint8Array, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => hashTransactionP2pOrder(transaction, sha256).reverse(); + +/** + * Return an encoded {@link Transaction}'s hash/ID as a string in user interface + * byte order (typically used by wallets and block explorers). + * + * @param transaction - the encoded transaction + */ +export const hashTransaction = (transaction: Uint8Array) => + binToHex(hashTransactionUiOrder(transaction)); + +/** + * Encode all outpoints in a series of transaction inputs. (For use in + * {@link hashTransactionOutpoints}.) + * + * @param inputs - the series of inputs from which to extract the outpoints + */ +export const encodeTransactionOutpoints = ( + inputs: readonly { + outpointIndex: number; + outpointTransactionHash: Uint8Array; + }[] +) => + flattenBinArray( + inputs.map((i) => + flattenBinArray([ + i.outpointTransactionHash.slice().reverse(), + numberToBinUint32LE(i.outpointIndex), + ]) + ) + ); + +/** + * Encode an array of transaction {@link Output}s for use in transaction signing + * serializations. Note, this encoding differs from + * {@link encodeTransactionOutputs} (used for encoding full transactions). + * + * @param outputs - the array of outputs to encode + */ +export const encodeTransactionOutputsForSigning = ( + outputs: readonly Output[] +) => flattenBinArray(outputs.map(encodeTransactionOutput)); + +/** + * Encode the sequence numbers of an array of transaction inputs for use in + * transaction signing serializations. + * + * @param inputs - the array of inputs from which to extract the sequence + * numbers + */ +export const encodeTransactionInputSequenceNumbersForSigning = ( + inputs: readonly { sequenceNumber: number }[] +) => flattenBinArray(inputs.map((i) => numberToBinUint32LE(i.sequenceNumber))); diff --git a/src/lib/transaction/transaction-types.ts b/src/lib/message/transaction-types.ts similarity index 68% rename from src/lib/transaction/transaction-types.ts rename to src/lib/message/transaction-types.ts index 3758e68d..53aa67e3 100644 --- a/src/lib/transaction/transaction-types.ts +++ b/src/lib/message/transaction-types.ts @@ -1,79 +1,4 @@ -import { CompilationData } from '../template/compiler-types'; -import { - CompilationError, - ResolvedScript, -} from '../template/language/language-types'; - -/** - * The partial transaction context which is shared between all of the inputs in - * a transaction. - */ -export interface TransactionContextSharedCommon { - /** - * A time or block height at which the transaction is considered valid (and - * can be added to the block chain). This allows signers to create time-locked - * transactions which may only become valid in the future. - */ - readonly locktime: number; - /** - * A.K.A. the serialization for `hashPrevouts` - * - * The signing serialization of all input outpoints. (See BIP143 or Bitcoin - * Cash's Replay Protected Sighash spec for details.) - */ - readonly transactionOutpoints: Uint8Array; - /* - * A.K.A. the serialization for `hashOutputs` with `SIGHASH_ALL` - * - * The signing serialization of output amounts and locking scripts. (See - * BIP143 or Bitcoin Cash's Replay Protected Sighash spec for details.) - */ - readonly transactionOutputs: Uint8Array; - /* - * A.K.A. the serialization for `hashSequence` - * - * The signing serialization of all input sequence numbers. (See BIP143 or - * Bitcoin Cash's Replay Protected Sighash spec for details.) - */ - readonly transactionSequenceNumbers: Uint8Array; - readonly version: number; -} - -/** - * The complete transaction context in which a single transaction input exists. - */ -export interface TransactionContextCommon - extends TransactionContextSharedCommon { - /* - * A.K.A. the serialization for `hashOutputs` with `SIGHASH_SINGLE` - * - * The signing serialization of the output at the same index as this input. If - * this input's index is larger than the total number of outputs (such that - * there is no corresponding output), this should be `undefined`. (See BIP143 - * or Bitcoin Cash's Replay Protected Sighash spec for details.) - */ - readonly correspondingOutput?: Uint8Array; - /** - * The index (within the previous transaction) of the outpoint being spent by - * this input. - */ - readonly outpointIndex: number; - /** - * The hash/ID of the transaction from which the outpoint being spent by this - * input originated. - */ - readonly outpointTransactionHash: Uint8Array; - /** - * The 8-byte `Uint64LE`-encoded value of the outpoint in satoshis (see - * `bigIntToBinUint64LE`). - */ - readonly outputValue: Uint8Array; - /** - * The `sequenceNumber` associated with the input being validated. See - * `Input.sequenceNumber` for details. - */ - readonly sequenceNumber: number; -} +import type { CompilationData, CompilationError, ResolvedScript } from '../lib'; /** * Data type representing a Transaction Input. @@ -99,22 +24,21 @@ export interface Input { * An "outpoint" is a reference (A.K.A. "pointer") to a specific output in a * previous transaction. * - * Encoded raw bitcoin transactions serialize this value in little-endian byte - * order. However, it is more common to use big-endian byte order when - * displaying transaction hashes. (In part because the SHA-256 specification - * defines its output as big-endian, so this byte order is output by most - * cryptographic libraries.) + * Encoded raw bitcoin transactions encode this value in little-endian byte + * order (see {@link hashTransactionP2pOrder}). However, it is more common to + * use big-endian byte order when displaying transaction hashes + * (see {@link hashTransactionUiOrder}). */ outpointTransactionHash: HashRepresentation; /** * The positive, 32-bit unsigned integer used as the "sequence number" for * this input. * - * A sequence number is a complex bitfield which can encode several properties + * A sequence number is a complex bitfield that can encode several properties * about an input: * - **sequence age support** – whether or not the input can use * `OP_CHECKSEQUENCEVERIFY`, and the minimum number of blocks or length of - * time which has passed since this input's source transaction was mined (up + * time that has passed since this input's source transaction was mined (up * to approximately 1 year). * - **locktime support** – whether or not the input can use * `OP_CHECKLOCKTIMEVERIFY` @@ -130,7 +54,7 @@ export interface Input { * input: a `lockingBytecode` can use the `OP_CHECKSEQUENCEVERIFY` operation * to verify that the funds being spent have been "locked" for a minimum * required amount of time (or block count). This can be used in protocols - * which require a reliable "proof-of-publication", like escrow, time-delayed + * that require a reliable "proof-of-publication", like escrow, time-delayed * withdrawals, and various payment channel protocols. * * Sequence age support is enabled unless the "disable bit" – the most @@ -164,7 +88,7 @@ export interface Input { * intended for use in a multi-party signing protocol where parties updated * the "sequence number" to indicate to miners that this input should replace * a previously-signed input in an existing, not-yet-mined transaction. The - * original use-case was not completed and relied on behavior which can not be + * original use-case was not completed and relied on behavior that can not be * enforced by mining consensus, so the field was mostly-unused until it was * repurposed by BIP68 in block `419328`. See BIP68, BIP112, and BIP113 for * details. @@ -172,7 +96,7 @@ export interface Input { sequenceNumber: number; /** * The bytecode used to unlock a transaction output. To spend an output, - * unlocking bytecode must be included in a transaction input which – when + * unlocking bytecode must be included in a transaction input that – when * evaluated in the authentication virtual machine with the locking bytecode – * completes in valid state. * @@ -186,12 +110,12 @@ export interface Input { * * @typeParam Bytecode - the type of `lockingBytecode` - this can be configured * to allow for defining compilation directives - * @typeParam Amount - the type of `satoshis` + * @typeParam Amount - the type of `valueSatoshis` */ export interface Output { /** * The bytecode used to encumber this transaction output. To spend the output, - * unlocking bytecode must be included in a transaction input which – when + * unlocking bytecode must be included in a transaction input that – when * evaluated before the locking bytecode – completes in a valid state. * * A.K.A. `scriptPubKey` or "locking script" @@ -205,43 +129,43 @@ export interface Output { * * This value could be defined using a `number`, as `Number.MAX_SAFE_INTEGER` * (`9007199254740991`) is about 4 times larger than the maximum number of - * satoshis which should ever exist. I.e. even if all satoshis were + * satoshis that should ever exist. I.e. even if all satoshis were * consolidated into a single output, the transaction spending this output * could still be defined with a numeric `satoshis` value. * * However, because the encoded output format for version 1 and 2 transactions * (used in both transaction encoding and signing serialization) uses a 64-bit - * unsigned, little-endian integer to serialize `satoshis`, this property is + * unsigned, little-endian integer to encode `valueSatoshis`, this property is * encoded in the same format, allowing it to cover the full possible range. * * This is useful for encoding values using schemes for fractional satoshis * (for which no finalized specification yet exists) or for encoding - * intentionally excessive values. For example, `invalidSatoshis` + * intentionally excessive values. For example, `excessiveSatoshis` * (`0xffffffffffffffff` - the maximum uint64 value) is a clearly impossible - * `satoshis` value for version 1 and 2 transactions. As such, this value can - * safely by used by transaction signing and verification implementations to - * ensure that an otherwise properly-signed transaction can never be included - * n the blockchain, e.g. for transaction size estimation or off-chain Bitauth - * signatures. + * `valueSatoshis` value for version 1 and 2 transactions. As such, this value + * can safely be used by transaction signing and verification implementations + * to ensure that an otherwise properly-signed transaction can never be + * included in the blockchain, e.g. for transaction size estimation or + * off-chain Bitauth signatures. * - * To convert this value to and from a `BigInt` use `bigIntToBinUint64LE` and - * `binToBigIntUint64LE`, respectively. + * To convert this value to and from a `BigInt` use + * {@link bigIntToBinUint64LE} and {@link binToBigIntUint64LE}, respectively. */ - readonly satoshis: Amount; + readonly valueSatoshis: Amount; } /** * The maximum uint64 value – an impossibly large, intentionally invalid value - * for `satoshis`. See `Transaction.satoshis` for details. + * for `valueSatoshis`. See {@link Transaction.valueSatoshis} for details. */ // prettier-ignore // eslint-disable-next-line @typescript-eslint/no-magic-numbers -export const invalidSatoshis = Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]); +export const excessiveSatoshis = Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]); /** * Data type representing a transaction. */ -export interface Transaction { +export interface TransactionCommon { /** * An array of inputs included in this transaction. * @@ -280,7 +204,7 @@ export interface Transaction { * to be properly validated without requiring the virtual machine to check the * sequence number of every other input (only that of the current input). * - * This is inconsequential for valid transactions, since any transaction which + * This is inconsequential for valid transactions, since any transaction that * disables `locktime` must have disabled locktime for all of its inputs; * `OP_CHECKLOCKTIMEVERIFY` is always properly enforced. However, because an * input can individually "disable locktime" without the full transaction @@ -309,11 +233,11 @@ export interface CompilationDirectiveLocking< CompilationDataType > { /** - * The `Compiler` with which to generate bytecode. + * The {@link Compiler} with which to generate bytecode. */ compiler: CompilerType; /** - * The `CompilationData` required to compile the specified script. + * The {@link CompilationData} required to compile the specified script. */ data?: CompilationDataType; /** @@ -327,10 +251,10 @@ export interface CompilationDirectiveUnlocking< CompilationDataType > extends CompilationDirectiveLocking { /** - * The `satoshis` value of the `Output` being spent by this input. Required - * for use in signing serializations. + * The `satoshis` value of the {@link Output} being spent by this input. + * Required for use in signing serializations. */ - satoshis: Output['satoshis']; + valueSatoshis: Output['valueSatoshis']; } export interface CompilationDirectiveUnlockingEstimate< @@ -338,39 +262,39 @@ export interface CompilationDirectiveUnlockingEstimate< CompilationDataType > extends CompilationDirectiveUnlocking { /** - * The scenario ID which can be used to estimate the final size of this + * The scenario ID that can be used to estimate the final size of this * unlocking script. This is required when using fee estimation. */ estimate: string; } /** - * An input which may optionally use a `CompilationDirectiveUnlocking` as its - * `unlockingBytecode` property. During compilation, the final `lockingBytecode` - * will be generated from this directive. + * An input that may optionally use a {@link CompilationDirectiveUnlocking} as + * its `unlockingBytecode` property. During compilation, the final + * `lockingBytecode` will be generated from this directive. * * If `RequireEstimate` is `true`, all input directives must include an - * `estimate` scenario ID. See `estimateTransaction` for details. + * `estimate` scenario ID. See {@link estimateTransaction} for details. */ export type InputTemplate< CompilerType, RequireEstimate = false, CompilationDataType = CompilationData > = Input< + | Uint8Array | (RequireEstimate extends true ? CompilationDirectiveUnlockingEstimate : CompilationDirectiveUnlocking) - | Uint8Array >; /** - * An output which may optionally use a `CompilationDirectiveLocking` as its - * `lockingBytecode` property. During compilation, the final `lockingBytecode` - * will be generated from this directive. + * An output that may optionally use a {@link CompilationDirectiveLocking} as + * its `lockingBytecode` property. During compilation, the final + * `lockingBytecode` will be generated from this directive. * - * If `EnableFeeEstimation` is `true`, the `satoshis` value may also be + * If `EnableFeeEstimation` is `true`, the `valueSatoshis` value may also be * `undefined` (as estimated transactions always set output values to - * `invalidSatoshis`). + * {@link excessiveSatoshis}). */ export type OutputTemplate< CompilerType, @@ -382,20 +306,20 @@ export type OutputTemplate< >; /** - * A `Transaction` which may optionally use compilation directives in place of - * `lockingBytecode` and `unlockingBytecode` instances. During transaction - * generation, these directives will be generated from these directives. + * A {@link Transaction} that may optionally use compilation directives in place + * of `lockingBytecode` and `unlockingBytecode` instances. During transaction + * generation, VM bytecode will be generated from these directives. * * If `EnableFeeEstimation` is `true`, all input directives must include an - * `estimate` scenario ID, and the `satoshis` value of each output may also be - * `undefined` (as estimated transactions always set output values to - * `invalidSatoshis`). + * `estimate` scenario ID, and the `valueSatoshis` value of each output may also + * be `undefined` (as estimated transactions always set output values to + * `excessiveSatoshis`). */ export type TransactionTemplate< CompilerType, EnableFeeEstimation = false, CompilationDataType = CompilationData -> = Transaction< +> = TransactionCommon< InputTemplate, OutputTemplate >; @@ -404,19 +328,18 @@ export type TransactionTemplate< * A transaction template where all output amounts are provided (i.e. the values * of each "change" output has been decided). To estimate the final transaction * size given a transaction template (and from it, the required transaction - * fee), see `estimateTransaction`. + * fee), see {@link estimateTransaction}. */ -export type TransactionTemplateFixed = TransactionTemplate< - CompilerType ->; +export type TransactionTemplateFixed = + TransactionTemplate; /** - * A transaction template which enables fee estimation. The template must - * include an `inputSatoshis` value (the total satoshi value of all + * A transaction template that enables fee estimation. The template must + * include a `totalInputValueSatoshis` value (the total satoshi value of all * transaction inputs); all unlocking compilation directives must provide an - * `estimate` scenario ID which is used to estimate the size of the resulting - * unlocking bytecode; and the `satoshis` value of outputs is optional (all - * satoshi values will be set to `impossibleSatoshis` in the estimated + * `estimate` scenario ID that is used to estimate the size of the resulting + * unlocking bytecode; and the `valueSatoshis` value of outputs is optional (all + * satoshi values will be set to {@link excessiveSatoshis} in the estimated * transaction). */ export type TransactionTemplateEstimated = TransactionTemplate< @@ -426,9 +349,9 @@ export type TransactionTemplateEstimated = TransactionTemplate< /** * The total satoshi value of all transaction inputs. This is required when * using fee estimation, and is used to calculate the appropriate value of - * change outputs (outputs with `satoshis` set to `undefined`). + * change outputs (outputs with `valueSatoshis` set to `undefined`). */ - inputSatoshis: number; + totalInputValueSatoshis: number; }; /** @@ -444,18 +367,13 @@ export interface BytecodeGenerationErrorBase { * The input or output index for which this bytecode was being generated. (To ) */ index: number; - /** - * The stage of generation at which this error occurred – the `outputs` stage - * must complete before the `inputs` can begin. - */ - // stage: 'outputs' | 'inputs'; /** * If the error occurred after the `parse` stage, the resolved script is * provided for analysis or processing (e.g. `getResolvedBytecode`). */ resolved?: ResolvedScript; /** - * The compilation errors which occurred while generating this bytecode. + * The compilation errors that occurred while generating this bytecode. */ errors: CompilationError[]; } @@ -476,7 +394,7 @@ export interface BytecodeGenerationCompletionBase { * `lockingBytecode`). If `input`, the bytecode was generated for the input at * `index` (an `unlockingBytecode`). */ - type: 'output' | 'input'; + type: 'input' | 'output'; /** * The index of the input or output for which this bytecode was generated. */ @@ -511,25 +429,15 @@ export interface BytecodeGenerationCompletionOutput * final inputs contain compilation directives. */ export type BytecodeGenerationCompletion = - | BytecodeGenerationCompletionOutput - | BytecodeGenerationCompletionInput; + | BytecodeGenerationCompletionInput + | BytecodeGenerationCompletionOutput; export interface TransactionGenerationSuccess { success: true; - transaction: Transaction; + transaction: TransactionCommon; } export type TransactionGenerationError = - | { - success: false; - completions: BytecodeGenerationCompletionOutput[]; - errors: BytecodeGenerationErrorLocking[]; - /** - * Error(s) occurred at the `output` stage of compilation, so the `input` - * stage never began. - */ - stage: 'outputs'; - } | { success: false; completions: BytecodeGenerationCompletionInput[]; @@ -539,8 +447,18 @@ export type TransactionGenerationError = * `output` stage completed successfully. */ stage: 'inputs'; + } + | { + success: false; + completions: BytecodeGenerationCompletionOutput[]; + errors: BytecodeGenerationErrorLocking[]; + /** + * Error(s) occurred at the `output` stage of compilation, so the `input` + * stage never began. + */ + stage: 'outputs'; }; export type TransactionGenerationAttempt = - | TransactionGenerationSuccess - | TransactionGenerationError; + | TransactionGenerationError + | TransactionGenerationSuccess; diff --git a/src/lib/schema/README.md b/src/lib/schema/README.md new file mode 100644 index 00000000..c379ecba --- /dev/null +++ b/src/lib/schema/README.md @@ -0,0 +1,3 @@ +# Libauth Schemas + +Much of this directory is automatically generated by the `gen:schema:*` package scripts. **Any changes to generated content will be overwritten automatically**. To modify a schema, modify the underlying type from which it is generated, then re-generate it. For details, review the respective `gen:schema:*` package scripts. diff --git a/src/lib/schema/ajv/ajv-types.d.ts b/src/lib/schema/ajv/ajv-types.d.ts new file mode 100644 index 00000000..9d4c829f --- /dev/null +++ b/src/lib/schema/ajv/ajv-types.d.ts @@ -0,0 +1,34 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +export interface AjvError< + Keyword = string, + Params = { [paramName: string]: number | string } +> { + keyword: Keyword; + instancePath: string; + schemaPath: string; + params: Params; + message: string; +} + +export type LibauthAjvError = + | AjvError<'additionalProperties', { additionalProperty: string }> + | AjvError<'required', { missingProperty: string }> + | AjvError<'type', { type: string }>; + +/** + * Note: these types cover only Libauth use cases; other `ajv` error types are + * possible using other settings. + */ +// eslint-disable-next-line functional/no-mixed-type +export interface AjvValidator { + ( + data: unknown, + dataCxt?: { + instancePath?: string; + parentData: any; + parentDataProperty: any; + rootData?: any; + } + ): data is T; + errors?: LibauthAjvError[] | null; +} diff --git a/src/lib/schema/ajv/ajv-utils.ts b/src/lib/schema/ajv/ajv-utils.ts new file mode 100644 index 00000000..424911fc --- /dev/null +++ b/src/lib/schema/ajv/ajv-utils.ts @@ -0,0 +1,26 @@ +import type { AjvValidator, LibauthAjvError } from './ajv-types.js'; +import AuthenticationTemplateValidator from './validate-authentication-template.js'; + +const avjErrorsToDescription = (errors: LibauthAjvError[]): string => + // TODO: translate instancePath + errors.map((error) => `${error.instancePath}: ${error.message}`).join(','); + +export const ajvStandaloneJsonParse = ( + untrustedJsonOrObject: unknown, + validator: AjvValidator +) => { + // eslint-disable-next-line functional/no-try-statement + try { + const parsed = + typeof untrustedJsonOrObject === 'string' + ? (JSON.parse(untrustedJsonOrObject) as unknown) + : untrustedJsonOrObject; + if (validator(parsed)) { + return parsed; + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return avjErrorsToDescription(AuthenticationTemplateValidator.errors!); + } catch (e) { + return `Invalid JSON. ${String(e)}`; + } +}; diff --git a/src/lib/schema/ajv/validate-authentication-template.d.ts b/src/lib/schema/ajv/validate-authentication-template.d.ts new file mode 100644 index 00000000..c76cb72d --- /dev/null +++ b/src/lib/schema/ajv/validate-authentication-template.d.ts @@ -0,0 +1,7 @@ +import type { AuthenticationTemplate } from '../../lib'; + +import type { AjvValidator } from './ajv-types'; + +declare const validator: AjvValidator; +// eslint-disable-next-line import/no-default-export +export default validator; diff --git a/src/lib/schema/ajv/validate-authentication-template.js b/src/lib/schema/ajv/validate-authentication-template.js new file mode 100644 index 00000000..6b2096d9 --- /dev/null +++ b/src/lib/schema/ajv/validate-authentication-template.js @@ -0,0 +1,6419 @@ +export default validate20; +const schema22 = { + $ref: '#/definitions/AuthenticationTemplate', + $schema: 'http://json-schema.org/draft-07/schema#', + definitions: { + AuthenticationTemplate: { + additionalProperties: false, + description: + 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + properties: { + $schema: { + description: + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + type: 'string', + }, + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + entities: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateEntity', + }, + description: + 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this authentication template (for use in user interfaces).', + type: 'string', + }, + scenarios: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateScenario', + }, + description: + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + scripts: { + additionalProperties: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScript' }, + { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, + { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, + { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + ], + }, + description: + 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + supported: { + description: + 'A list of authentication virtual machine versions supported by this template.\n\nVirtual machine identifiers use the format `CODE_YYYY_MM`, where `CODE` is the currency code used to identify the network, and `YYYY_MM` is the year and month in which the specified VM version became active on the indicated network.\n\nIdentifiers with the `_SPEC` suffix indicate that this template is intended for compatibility with a future virtual machine version, but at the time the template was create, that virtual machine had not yet become active on the specified chain.\n\nThe earliest possible `_SPEC` virtual machine version is `BCH_2020_11_SPEC`, the first virtual machine version after the public release of the version `0` AuthenticationTemplate format.', + items: { + $ref: '#/definitions/AuthenticationVirtualMachineIdentifier', + }, + type: 'array', + }, + version: { + const: 0, + description: + 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + type: 'number', + }, + }, + required: ['entities', 'scripts', 'supported', 'version'], + type: 'object', + }, + AuthenticationTemplateAddressData: { + additionalProperties: false, + properties: { + description: { + description: + 'A single-line, human readable description for this address data.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this address data.', + type: 'string', + }, + type: { + const: 'AddressData', + description: + '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + AuthenticationTemplateEntity: { + additionalProperties: false, + description: + 'An object describing the configuration for a particular entity within an authentication template.', + properties: { + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this entity (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this entity for use in user interfaces and error messages, e.g.: `Trusted Third-Party`.', + type: 'string', + }, + scripts: { + description: + 'An array of the identifiers of each script the entity must be capable of generating, e.g. each of the unlocking scripts this entity might use.\n\nProvided the necessary variables, any entity can construct any script, but this option allows us to hint to more advanced wallets which scripts to recommend to users. (Especially when many scripts require inter-entity communication initiated by a user.)\n\nIf not provided, this property is assumed to include all scripts in the template.', + items: { type: 'string' }, + type: 'array', + }, + variables: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateVariable', + }, + description: + "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", + type: 'object', + }, + }, + type: 'object', + }, + AuthenticationTemplateHdKey: { + additionalProperties: false, + properties: { + addressOffset: { + description: + 'The offset by which to increment the `addressIndex` provided in the compilation data when deriving this `HdKey`. (Default: 0)\n\nThis is useful for deriving the "next" (`1`) or "previous" (`-1`) address to be used in the current compiler configuration.', + type: 'number', + }, + description: { + description: + 'A single-line, human readable description for this HD key.', + type: 'string', + }, + hdPublicKeyDerivationPath: { + description: + "The path to derive the entity's HD public key from the entity's master HD private key. By default, `m` (i.e. the entity's HD public key represents the same node in the HD tree as its HD private key).\n\nThis can be used to specify another derivation path from which the `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See `publicDerivationPath` for details.\n\nThis path must begin with an `m` (private derivation) and be fixed – it cannot contain an `i` character to represent the address index, as a dynamic hardened path would require a new HD public key for each address.", + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this HD key.', + type: 'string', + }, + privateDerivationPath: { + description: + "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", + type: 'string', + }, + publicDerivationPath: { + description: + "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", + type: 'string', + }, + type: { + const: 'HdKey', + description: + 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + AuthenticationTemplateKey: { + additionalProperties: false, + properties: { + description: { + description: + 'A single-line, human readable description for this key.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this key.', + type: 'string', + }, + type: { + const: 'Key', + description: + 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + AuthenticationTemplateScenario: { + additionalProperties: false, + description: + 'An object describing the configuration for a particular scenario within an authentication template.', + properties: { + data: { + $ref: '#/definitions/AuthenticationTemplateScenarioData', + description: + "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", + }, + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this scenario (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + extends: { + description: + "The identifier of the scenario that this scenario extends. Any `data` or `transaction` properties not defined in this scenario inherit from the extended parent scenario.\n\nIf undefined, this scenario is assumed to extend the default scenario:\n\n- The default values for `data` are set: - The identifiers of all `Key` variables and entities in this template are lexicographically sorted, then each is assigned an incrementing positive integer – beginning with `1` – encoded as an unsigned, 256-bit, big-endian integer (i.e. `0x0000...0001` (32 bytes), `0x0000...0002`, `0x0000...0003`, etc.). For `Key`s, this assigned value is used as the private key; For entities, the assigned value is used as the master seed of that entity's `HdPrivateKey`. If `hdKey` is set, the `addressIndex` is set to `0`. - `currentBlockHeight` is set to `2`. This is the height of the second mined block after the genesis block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. This default value was chosen to be low enough to simplify the debugging of block height offsets while remaining differentiated from `0` and `1`, which are used both as boolean return values and for control flow. - `currentBlockTime` is set to `1231469665`. This is the Median Time-Past block time (BIP113) of block `2`.\n\n- Then `transaction` is set based on use: - if the scenario is being used for transaction estimation, all transaction properties are taken from the transaction being estimated. - if the scenario is being used for script testing and validation, the default value for each `transaction` property is used.\n\nWhen a scenario is extended, each property of `data` and `transaction` is extended individually: if the extending scenario does not provide a new value for `data.bytecode.value` or `transaction.property`, the parent value is used. To avoid inheriting a parent value, each child value must be individually overridden.", + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this scenario for use in user interfaces, e.g.: `Delayed Recovery`.', + type: 'string', + }, + sourceOutputs: { + description: + 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', + items: { + $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', + }, + type: 'array', + }, + transaction: { + additionalProperties: false, + description: + 'The transaction within which this scenario should be evaluated. This is used for script testing and validation.\n\nIf undefined, inherits the default value for each property: ```json { "inputs": [{ "unlockingBytecode": [\'slot\'] }], "locktime": 0, "outputs": [{ "lockingBytecode": {} }], "version": 2 } ```\n\nAny `transaction` property that is not set will be inherited from the scenario specified by `extends`. when specifying the `inputs` and `outputs` properties, each input and output extends the default values for inputs and outputs, respectively.\n\nFor example, an input of `{}` is interpreted as: ```json { "outpointIndex": 0, "outpointTransactionHash": "0000000000000000000000000000000000000000000000000000000000000000", "sequenceNumber": 0, "unlockingBytecode": [\'slot\'] } ``` And an output of `{}` is interpreted as: ```json { "lockingBytecode": { "script": [\'copy\'], "overrides": { "hdKeys": { "addressIndex": 1 } } }, "valueSatoshis": 0 } ```', + properties: { + inputs: { + description: + 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', + items: { + $ref: '#/definitions/AuthenticationTemplateScenarioInput', + }, + type: 'array', + }, + locktime: { + description: + 'The locktime to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, defaults to `0`.\n\nLocktime can be provided as either a timestamp or a block height. Values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`). Values greater than or equal to `500000000` are understood to be a UNIX timestamp.\n\nFor validating timestamp values, the median timestamp of the last 11 blocks (Median Time-Past) is used. The precise behavior is defined in BIP113.\n\nIf the `sequenceNumber` of every transaction input is set to `0xffffffff` (`4294967295`), locktime is disabled, and the transaction may be added to a block even if the specified locktime has not yet been reached. When locktime is disabled, if an `OP_CHECKLOCKTIMEVERIFY` operation is encountered during the verification of any input, an error is produced, and the transaction is invalid.', + type: 'number', + }, + outputs: { + description: + 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', + items: { + $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + }, + type: 'array', + }, + version: { + description: + 'The version to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, inherits the default scenario `version` value: `2`.', + type: 'number', + }, + }, + type: 'object', + }, + }, + type: 'object', + }, + AuthenticationTemplateScenarioBytecode: { + anyOf: [ + { type: 'string' }, + { + additionalProperties: false, + properties: { + overrides: { + $ref: '#/definitions/AuthenticationTemplateScenarioData', + description: + 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', + }, + script: { + anyOf: [ + { type: 'string' }, + { + items: { const: 'copy', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The identifier of the script to compile when generating this bytecode. May also be set to `["copy"]`, which is automatically replaced with the identifier of the locking or unlocking script under test, respectively.\n\nIf undefined, defaults to `["copy"]`.', + }, + }, + type: 'object', + }, + ], + description: + 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', + }, + AuthenticationTemplateScenarioData: { + additionalProperties: false, + description: + 'An object defining the data to use while compiling a scenario.', + properties: { + bytecode: { + additionalProperties: { type: 'string' }, + description: + "A map of full identifiers to CashAssembly scripts that compile to each identifier's value for this scenario. Allowing `bytecode` to be specified as scripts (rather than e.g. hex) offers greater power and flexibility.\n\nBytecode scripts have access to each other and all other template scripts and defined variables, however, cyclical references will produce an error at compile time. Also, because the results of these compilations will be used to generate the compilation context for this scenario, these scripts may not use compiler operations that themselves require access to compilation context (e.g. signatures).\n\nThe provided `fullIdentifier` should match the complete identifier for each item, e.g. `some_wallet_data`, `variable_id.public_key`, or `variable_id.signature.all_outputs`.\n\nAll `AddressData` and `WalletData` variables must be provided via `bytecode` (though the default scenario automatically includes reasonable values), and pre-computed results for operations of other variable types (e.g. `key.public_key`) may also be provided via this property.\n\nBecause each bytecode identifier may precisely match the identifier of the variable it defines for this scenario, references between these scripts must refer to the target script with a `_scenario.` prefix. E.g. to reference a sibling script `my_foo` from `my_bar`, the `my_bar` script must use the identifier `_scenario.my_foo`.", + type: 'object', + }, + currentBlockHeight: { + description: + 'The current block height at the "address creation time" implied in this scenario.', + type: 'number', + }, + currentBlockTime: { + description: + 'The current MTP block time as a UNIX timestamp at the "address creation time" implied in this scenario.\n\nNote, this is never a current timestamp, but rather the median timestamp of the last 11 blocks. It is therefore approximately one hour in the past.\n\nEvery block has a precise MTP block time, much like a block height. See BIP113 for details.', + type: 'number', + }, + hdKeys: { + additionalProperties: false, + description: + 'An object describing the settings used for `HdKey` variables in this scenario.', + properties: { + addressIndex: { + description: + 'The current address index to be used for this scenario. The `addressIndex` gets added to each `HdKey`s `addressOffset` to calculate the dynamic index (`i`) used in each `privateDerivationPath` or `publicDerivationPath`.\n\nThis is required for any compiler operation that requires derivation. Typically, the value is incremented by one for each address in a wallet.\n\nDefaults to `0`.', + type: 'number', + }, + hdPrivateKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of entity IDs to master HD private keys. These master HD private keys are used to derive each `HdKey` variable assigned to that entity according to its `privateDerivationPath`.\n\nHD private keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.', + type: 'object', + }, + hdPublicKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of entity IDs to HD public keys. These HD public keys are used to derive public keys for each `HdKey` variable assigned to that entity according to its `publicDerivationPath`.\n\nHD public keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.', + type: 'object', + }, + }, + type: 'object', + }, + keys: { + additionalProperties: false, + description: + 'An object describing the settings used for `Key` variables in this scenario.', + properties: { + privateKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of `Key` variable IDs to their 32-byte, hexadecimal-encoded private key values.', + type: 'object', + }, + }, + type: 'object', + }, + }, + type: 'object', + }, + AuthenticationTemplateScenarioInput: { + additionalProperties: false, + description: + 'An example input used to define a scenario for an authentication template.', + properties: { + outpointIndex: { + description: + 'The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to the same index as the input itself (so that by default, every outpoint in the produced transaction is different, even if an empty `outpointTransactionHash` is used for each transaction).', + type: 'number', + }, + outpointTransactionHash: { + description: + 'A 32-byte, hexadecimal-encoded hash of the transaction from which this input is spent in big-endian byte order. This is the byte order typically seen in block explorers and user interfaces (as opposed to little-endian byte order, which is used in standard P2P network messages).\n\nIf undefined, this defaults to the "empty" hash: `0000000000000000000000000000000000000000000000000000000000000000`\n\nA.K.A. Outpoint `Transaction ID`', + type: 'string', + }, + sequenceNumber: { + description: + 'The positive, 32-bit unsigned integer used as the "sequence number" for this input.\n\nIf undefined, this defaults to `0`.', + type: 'number', + }, + unlockingBytecode: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { + items: { const: 'slot', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + }, + }, + type: 'object', + }, + 'AuthenticationTemplateScenarioOutput': { + additionalProperties: false, + description: + 'An example output used to define a scenario for an authentication template.', + properties: { + lockingBytecode: { + $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + description: + 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', + }, + valueSatoshis: { + description: + 'The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `"ffffffffffffffff"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.', + type: ['number', 'string'], + }, + }, + type: 'object', + }, + 'AuthenticationTemplateScenarioOutput': { + additionalProperties: false, + description: + 'An example output used to define a scenario for an authentication template.', + properties: { + lockingBytecode: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { + items: { const: 'slot', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', + }, + valueSatoshis: { + description: + 'The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `"ffffffffffffffff"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.', + type: ['number', 'string'], + }, + }, + type: 'object', + }, + AuthenticationTemplateScenarioSourceOutput: { + $ref: '#/definitions/AuthenticationTemplateScenarioOutput', + description: + 'A source output used by an authentication template scenario.', + }, + AuthenticationTemplateScenarioTransactionOutput: { + $ref: '#/definitions/AuthenticationTemplateScenarioOutput', + description: + 'A transaction output used to define an authentication template scenario transaction.', + }, + AuthenticationTemplateScript: { + additionalProperties: false, + description: + 'An object describing the configuration for a particular script within an authentication template.', + properties: { + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + }, + required: ['script'], + type: 'object', + }, + AuthenticationTemplateScriptLocking: { + additionalProperties: false, + properties: { + lockingType: { + description: + 'Indicates if P2SH20 infrastructure should be used when producing bytecode related to this script. For more information on P2SH20, see BIP16.\n\nWhen compiling locking scripts of type `p2sh20`, the result will be placed in a P2SH20 "redeem script" format: `OP_HASH160 <$( OP_HASH160)> OP_EQUAL`\n\nWhen compiling unlocking scripts that unlock locking scripts of type `p2sh20`, the result will be transformed into the P2SH20 unlocking format: `unlockingBytecode ` (where `lockingBytecode` is the compiled bytecode of the locking script, without the "redeem script" transformation.)\n\nThe presence of the `lockingType` property indicates that this script is a locking script. It must be present on any script referenced by the `unlocks` property of another script.', + enum: ['p2sh20', 'standard'], + type: 'string', + }, + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + }, + required: ['lockingType', 'script'], + type: 'object', + }, + AuthenticationTemplateScriptTest: { + additionalProperties: false, + properties: { + check: { + description: + 'The script to evaluate after the script being tested. This can be used to check that the tested script leaves the expected results on the stack. For example, if the tested script is expected to leave 3 items of a specific size on the stack, the `check` script could pop each resulting item from the stack and examine it for correctness.\n\nIn scenario testing, this script is appended to the script under test, and together they are treated as the locking script. Program evaluation is considered successful if the resulting program state can be verified by the virtual machine (e.g. the resulting stack contains a single `1`, no errors are produced, etc.).', + type: 'string', + }, + fails: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that fails program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + invalid: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in a compilation error. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this test (for use in user interfaces).', + type: 'string', + }, + passes: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that passes program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + setup: { + description: + 'A script to evaluate before the script being tested. This can be used to push values to the stack that are operated on by the tested script.\n\nIn scenario testing, this script is treated as the unlocking script.', + type: 'string', + }, + }, + required: ['check'], + type: 'object', + }, + AuthenticationTemplateScriptTested: { + additionalProperties: false, + properties: { + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + pushed: { + description: + 'If set to `true`, indicates that this script should be wrapped in a push statement for testing.\n\nThis is useful for scripts that serve as "bytecode templates" – e.g. formatted messages or signature preimages. These scripts are typically not evaluated as bytecode but appear within push statements elsewhere in the template.\n\nDefaults to `false`.', + type: 'boolean', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + tests: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateScriptTest', + }, + description: + 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', + type: 'object', + }, + }, + required: ['script', 'tests'], + type: 'object', + }, + AuthenticationTemplateScriptUnlocking: { + additionalProperties: false, + properties: { + ageLock: { + description: + 'TODO: not yet implemented\n\nThe minimum input age required for this unlocking script to become valid.\n\nThis value is provided as a CashAssembly script that must compile to the least significant 3 bytes of the minimum sequence number required for this unlocking script to be valid (the "type bit" and the 2-byte "value" – see BIP68 for details). This script has access to all other template scripts and variables, but cyclical references will produce an error at compile time.\n\nIn supporting wallets, this value can be computed at address creation time, and the remaining time for which any UTXO remains "age-locked" can be displayed in user interfaces (by parsing the "type bit" and "value" as described in BIP68).\n\nNote, because the precise value used by `OP_CHECKSEQUENCEVERIFY` can be provided in the unlocking script, it is trivial to create an unlocking script for which a proper value for `ageLock` is not possible to determine until the spending transaction is prepared. These cases are intentionally out-of-scope for this property. Instead, `ageLock` should only be used for unlocking scripts where the expected value can be compiled at address creation time.', + type: 'string', + }, + estimate: { + description: + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + type: 'string', + }, + fails: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that fails program verification.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + invalid: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in a compilation error.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + passes: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that passes program verification.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + timeLockType: { + description: + "The expected type of time locks in this script.\n\nBecause `OP_CHECKLOCKTIMEVERIFY` reads from a transaction's `locktime` property, every input to a given transaction must share the same time lock type. This differs from `OP_CHECKSEQUENCEVERIFY` in that each input has its own `sequenceNumber`, so compatibility is not required.\n\nIf a transaction includes multiple inputs using scripts with `timeLockType` defined, and the types are not compatible, generation should fail.\n\nThe `timestamp` type indicates that the transaction's locktime is provided as a UNIX timestamp (the `locktime` value is greater than or equal to `500000000`).\n\nThe `height` type indicates that the transaction's locktime is provided as a block height (the `locktime` value is less than `500000000`).\n\nIf `timeLockType` is undefined, the script is assumed to have no reliance on absolute time locks.", + enum: ['height', 'timestamp'], + type: 'string', + }, + unlocks: { + description: + 'The identifier of the script that can be unlocked by this script.\n\nThe presence of the `unlocks` property indicates that this script is an unlocking script, and the script it unlocks must be a locking script.', + type: 'string', + }, + }, + required: ['script', 'unlocks'], + type: 'object', + }, + AuthenticationTemplateVariable: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateAddressData' }, + { $ref: '#/definitions/AuthenticationTemplateHdKey' }, + { $ref: '#/definitions/AuthenticationTemplateKey' }, + { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + ], + }, + AuthenticationTemplateWalletData: { + additionalProperties: false, + properties: { + description: { + description: + 'A single-line, human readable description for this wallet data.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this wallet data.', + type: 'string', + }, + type: { + const: 'WalletData', + description: + 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + AuthenticationVirtualMachineIdentifier: { + description: + 'Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin (Core) network.\n\nVirtual machine versions may be marked with the `SPEC` suffix to indicate that they have not yet been deployed to a main network and are therefore only a draft specification. After deployment, when template compatibility is verified, templates should update their `supported` array to indicate compatibility with the live virtual machine version.', + enum: [ + 'BCH_2019_05', + 'BCH_2019_11', + 'BCH_2020_05', + 'BCH_2020_11_SPEC', + 'BCH_2020_11', + 'BCH_2021_05_SPEC', + 'BCH_2021_05', + 'BCH_2021_11_SPEC', + 'BCH_2021_11', + 'BCH_2022_05_SPEC', + 'BCH_2022_05', + 'BCH_2022_11_SPEC', + 'BCH_2022_11', + 'BSV_2018_11', + 'BSV_2020_02', + 'BTC_2017_08', + ], + type: 'string', + }, + }, +}; +const schema23 = { + additionalProperties: false, + description: + 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + properties: { + $schema: { + description: + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + type: 'string', + }, + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + entities: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateEntity', + }, + description: + 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this authentication template (for use in user interfaces).', + type: 'string', + }, + scenarios: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateScenario', + }, + description: + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + scripts: { + additionalProperties: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScript' }, + { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, + { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, + { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + ], + }, + description: + 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + type: 'object', + }, + supported: { + description: + 'A list of authentication virtual machine versions supported by this template.\n\nVirtual machine identifiers use the format `CODE_YYYY_MM`, where `CODE` is the currency code used to identify the network, and `YYYY_MM` is the year and month in which the specified VM version became active on the indicated network.\n\nIdentifiers with the `_SPEC` suffix indicate that this template is intended for compatibility with a future virtual machine version, but at the time the template was create, that virtual machine had not yet become active on the specified chain.\n\nThe earliest possible `_SPEC` virtual machine version is `BCH_2020_11_SPEC`, the first virtual machine version after the public release of the version `0` AuthenticationTemplate format.', + items: { $ref: '#/definitions/AuthenticationVirtualMachineIdentifier' }, + type: 'array', + }, + version: { + const: 0, + description: + 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + type: 'number', + }, + }, + required: ['entities', 'scripts', 'supported', 'version'], + type: 'object', +}; +const schema37 = { + additionalProperties: false, + description: + 'An object describing the configuration for a particular script within an authentication template.', + properties: { + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + }, + required: ['script'], + type: 'object', +}; +const schema38 = { + additionalProperties: false, + properties: { + lockingType: { + description: + 'Indicates if P2SH20 infrastructure should be used when producing bytecode related to this script. For more information on P2SH20, see BIP16.\n\nWhen compiling locking scripts of type `p2sh20`, the result will be placed in a P2SH20 "redeem script" format: `OP_HASH160 <$( OP_HASH160)> OP_EQUAL`\n\nWhen compiling unlocking scripts that unlock locking scripts of type `p2sh20`, the result will be transformed into the P2SH20 unlocking format: `unlockingBytecode ` (where `lockingBytecode` is the compiled bytecode of the locking script, without the "redeem script" transformation.)\n\nThe presence of the `lockingType` property indicates that this script is a locking script. It must be present on any script referenced by the `unlocks` property of another script.', + enum: ['p2sh20', 'standard'], + type: 'string', + }, + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + }, + required: ['lockingType', 'script'], + type: 'object', +}; +const schema41 = { + additionalProperties: false, + properties: { + ageLock: { + description: + 'TODO: not yet implemented\n\nThe minimum input age required for this unlocking script to become valid.\n\nThis value is provided as a CashAssembly script that must compile to the least significant 3 bytes of the minimum sequence number required for this unlocking script to be valid (the "type bit" and the 2-byte "value" – see BIP68 for details). This script has access to all other template scripts and variables, but cyclical references will produce an error at compile time.\n\nIn supporting wallets, this value can be computed at address creation time, and the remaining time for which any UTXO remains "age-locked" can be displayed in user interfaces (by parsing the "type bit" and "value" as described in BIP68).\n\nNote, because the precise value used by `OP_CHECKSEQUENCEVERIFY` can be provided in the unlocking script, it is trivial to create an unlocking script for which a proper value for `ageLock` is not possible to determine until the spending transaction is prepared. These cases are intentionally out-of-scope for this property. Instead, `ageLock` should only be used for unlocking scripts where the expected value can be compiled at address creation time.', + type: 'string', + }, + estimate: { + description: + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + type: 'string', + }, + fails: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that fails program verification.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + invalid: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in a compilation error.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + passes: { + description: + 'A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that passes program verification.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + timeLockType: { + description: + "The expected type of time locks in this script.\n\nBecause `OP_CHECKLOCKTIMEVERIFY` reads from a transaction's `locktime` property, every input to a given transaction must share the same time lock type. This differs from `OP_CHECKSEQUENCEVERIFY` in that each input has its own `sequenceNumber`, so compatibility is not required.\n\nIf a transaction includes multiple inputs using scripts with `timeLockType` defined, and the types are not compatible, generation should fail.\n\nThe `timestamp` type indicates that the transaction's locktime is provided as a UNIX timestamp (the `locktime` value is greater than or equal to `500000000`).\n\nThe `height` type indicates that the transaction's locktime is provided as a block height (the `locktime` value is less than `500000000`).\n\nIf `timeLockType` is undefined, the script is assumed to have no reliance on absolute time locks.", + enum: ['height', 'timestamp'], + type: 'string', + }, + unlocks: { + description: + 'The identifier of the script that can be unlocked by this script.\n\nThe presence of the `unlocks` property indicates that this script is an unlocking script, and the script it unlocks must be a locking script.', + type: 'string', + }, + }, + required: ['script', 'unlocks'], + type: 'object', +}; +const schema42 = { + description: + 'Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin (Core) network.\n\nVirtual machine versions may be marked with the `SPEC` suffix to indicate that they have not yet been deployed to a main network and are therefore only a draft specification. After deployment, when template compatibility is verified, templates should update their `supported` array to indicate compatibility with the live virtual machine version.', + enum: [ + 'BCH_2019_05', + 'BCH_2019_11', + 'BCH_2020_05', + 'BCH_2020_11_SPEC', + 'BCH_2020_11', + 'BCH_2021_05_SPEC', + 'BCH_2021_05', + 'BCH_2021_11_SPEC', + 'BCH_2021_11', + 'BCH_2022_05_SPEC', + 'BCH_2022_05', + 'BCH_2022_11_SPEC', + 'BCH_2022_11', + 'BSV_2018_11', + 'BSV_2020_02', + 'BTC_2017_08', + ], + type: 'string', +}; +const schema24 = { + additionalProperties: false, + description: + 'An object describing the configuration for a particular entity within an authentication template.', + properties: { + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this entity (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this entity for use in user interfaces and error messages, e.g.: `Trusted Third-Party`.', + type: 'string', + }, + scripts: { + description: + 'An array of the identifiers of each script the entity must be capable of generating, e.g. each of the unlocking scripts this entity might use.\n\nProvided the necessary variables, any entity can construct any script, but this option allows us to hint to more advanced wallets which scripts to recommend to users. (Especially when many scripts require inter-entity communication initiated by a user.)\n\nIf not provided, this property is assumed to include all scripts in the template.', + items: { type: 'string' }, + type: 'array', + }, + variables: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateVariable', + }, + description: + "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", + type: 'object', + }, + }, + type: 'object', +}; +const schema25 = { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateAddressData' }, + { $ref: '#/definitions/AuthenticationTemplateHdKey' }, + { $ref: '#/definitions/AuthenticationTemplateKey' }, + { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + ], +}; +const schema26 = { + additionalProperties: false, + properties: { + description: { + description: + 'A single-line, human readable description for this address data.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this address data.', + type: 'string', + }, + type: { + const: 'AddressData', + description: + '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', +}; +const schema27 = { + additionalProperties: false, + properties: { + addressOffset: { + description: + 'The offset by which to increment the `addressIndex` provided in the compilation data when deriving this `HdKey`. (Default: 0)\n\nThis is useful for deriving the "next" (`1`) or "previous" (`-1`) address to be used in the current compiler configuration.', + type: 'number', + }, + description: { + description: 'A single-line, human readable description for this HD key.', + type: 'string', + }, + hdPublicKeyDerivationPath: { + description: + "The path to derive the entity's HD public key from the entity's master HD private key. By default, `m` (i.e. the entity's HD public key represents the same node in the HD tree as its HD private key).\n\nThis can be used to specify another derivation path from which the `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See `publicDerivationPath` for details.\n\nThis path must begin with an `m` (private derivation) and be fixed – it cannot contain an `i` character to represent the address index, as a dynamic hardened path would require a new HD public key for each address.", + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this HD key.', + type: 'string', + }, + privateDerivationPath: { + description: + "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", + type: 'string', + }, + publicDerivationPath: { + description: + "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", + type: 'string', + }, + type: { + const: 'HdKey', + description: + 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', +}; +const schema28 = { + additionalProperties: false, + properties: { + description: { + description: 'A single-line, human readable description for this key.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this key.', + type: 'string', + }, + type: { + const: 'Key', + description: + 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', +}; +const schema29 = { + additionalProperties: false, + properties: { + description: { + description: + 'A single-line, human readable description for this wallet data.', + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this wallet data.', + type: 'string', + }, + type: { + const: 'WalletData', + description: + 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + type: 'string', + }, + }, + required: ['type'], + type: 'object', +}; +function validate23( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + const _errs0 = errors; + let valid0 = false; + const _errs1 = errors; + const _errs2 = errors; + if (errors === _errs2) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.type === undefined && (missing0 = 'type')) { + const err0 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + const _errs4 = errors; + for (const key0 in data) { + if (!(key0 === 'description' || key0 === 'name' || key0 === 'type')) { + const err1 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + break; + } + } + if (_errs4 === errors) { + if (data.description !== undefined) { + const _errs5 = errors; + if (typeof data.description !== 'string') { + const err2 = { + instancePath: instancePath + '/description', + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + var valid2 = _errs5 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data.name !== undefined) { + const _errs7 = errors; + if (typeof data.name !== 'string') { + const err3 = { + instancePath: instancePath + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid2 = _errs7 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data.type !== undefined) { + let data2 = data.type; + const _errs9 = errors; + if (typeof data2 !== 'string') { + const err4 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + if ('AddressData' !== data2) { + const err5 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateAddressData/properties/type/const', + keyword: 'const', + params: { allowedValue: 'AddressData' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + var valid2 = _errs9 === errors; + } else { + var valid2 = true; + } + } + } + } + } + } else { + const err6 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateAddressData/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + } + } + var _valid0 = _errs1 === errors; + valid0 = valid0 || _valid0; + if (!valid0) { + const _errs11 = errors; + const _errs12 = errors; + if (errors === _errs12) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing1; + if (data.type === undefined && (missing1 = 'type')) { + const err7 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateHdKey/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: "must have required property '" + missing1 + "'", + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } else { + const _errs14 = errors; + for (const key1 in data) { + if ( + !( + key1 === 'addressOffset' || + key1 === 'description' || + key1 === 'hdPublicKeyDerivationPath' || + key1 === 'name' || + key1 === 'privateDerivationPath' || + key1 === 'publicDerivationPath' || + key1 === 'type' + ) + ) { + const err8 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key1 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + break; + } + } + if (_errs14 === errors) { + if (data.addressOffset !== undefined) { + let data3 = data.addressOffset; + const _errs15 = errors; + if (!(typeof data3 == 'number' && isFinite(data3))) { + const err9 = { + instancePath: instancePath + '/addressOffset', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/addressOffset/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err9]; + } else { + vErrors.push(err9); + } + errors++; + } + var valid4 = _errs15 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.description !== undefined) { + const _errs17 = errors; + if (typeof data.description !== 'string') { + const err10 = { + instancePath: instancePath + '/description', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err10]; + } else { + vErrors.push(err10); + } + errors++; + } + var valid4 = _errs17 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.hdPublicKeyDerivationPath !== undefined) { + const _errs19 = errors; + if (typeof data.hdPublicKeyDerivationPath !== 'string') { + const err11 = { + instancePath: instancePath + '/hdPublicKeyDerivationPath', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/hdPublicKeyDerivationPath/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err11]; + } else { + vErrors.push(err11); + } + errors++; + } + var valid4 = _errs19 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.name !== undefined) { + const _errs21 = errors; + if (typeof data.name !== 'string') { + const err12 = { + instancePath: instancePath + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err12]; + } else { + vErrors.push(err12); + } + errors++; + } + var valid4 = _errs21 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.privateDerivationPath !== undefined) { + const _errs23 = errors; + if (typeof data.privateDerivationPath !== 'string') { + const err13 = { + instancePath: instancePath + '/privateDerivationPath', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/privateDerivationPath/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err13]; + } else { + vErrors.push(err13); + } + errors++; + } + var valid4 = _errs23 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.publicDerivationPath !== undefined) { + const _errs25 = errors; + if (typeof data.publicDerivationPath !== 'string') { + const err14 = { + instancePath: + instancePath + '/publicDerivationPath', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/publicDerivationPath/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err14]; + } else { + vErrors.push(err14); + } + errors++; + } + var valid4 = _errs25 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data.type !== undefined) { + let data9 = data.type; + const _errs27 = errors; + if (typeof data9 !== 'string') { + const err15 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err15]; + } else { + vErrors.push(err15); + } + errors++; + } + if ('HdKey' !== data9) { + const err16 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateHdKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'HdKey' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + var valid4 = _errs27 === errors; + } else { + var valid4 = true; + } + } + } + } + } + } + } + } + } + } else { + const err17 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateHdKey/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + } + var _valid0 = _errs11 === errors; + valid0 = valid0 || _valid0; + if (!valid0) { + const _errs29 = errors; + const _errs30 = errors; + if (errors === _errs30) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing2; + if (data.type === undefined && (missing2 = 'type')) { + const err18 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateKey/required', + keyword: 'required', + params: { missingProperty: missing2 }, + message: "must have required property '" + missing2 + "'", + }; + if (vErrors === null) { + vErrors = [err18]; + } else { + vErrors.push(err18); + } + errors++; + } else { + const _errs32 = errors; + for (const key2 in data) { + if ( + !(key2 === 'description' || key2 === 'name' || key2 === 'type') + ) { + const err19 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateKey/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key2 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err19]; + } else { + vErrors.push(err19); + } + errors++; + break; + } + } + if (_errs32 === errors) { + if (data.description !== undefined) { + const _errs33 = errors; + if (typeof data.description !== 'string') { + const err20 = { + instancePath: instancePath + '/description', + schemaPath: + '#/definitions/AuthenticationTemplateKey/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err20]; + } else { + vErrors.push(err20); + } + errors++; + } + var valid6 = _errs33 === errors; + } else { + var valid6 = true; + } + if (valid6) { + if (data.name !== undefined) { + const _errs35 = errors; + if (typeof data.name !== 'string') { + const err21 = { + instancePath: instancePath + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateKey/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err21]; + } else { + vErrors.push(err21); + } + errors++; + } + var valid6 = _errs35 === errors; + } else { + var valid6 = true; + } + if (valid6) { + if (data.type !== undefined) { + let data12 = data.type; + const _errs37 = errors; + if (typeof data12 !== 'string') { + const err22 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err22]; + } else { + vErrors.push(err22); + } + errors++; + } + if ('Key' !== data12) { + const err23 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'Key' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err23]; + } else { + vErrors.push(err23); + } + errors++; + } + var valid6 = _errs37 === errors; + } else { + var valid6 = true; + } + } + } + } + } + } else { + const err24 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateKey/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err24]; + } else { + vErrors.push(err24); + } + errors++; + } + } + var _valid0 = _errs29 === errors; + valid0 = valid0 || _valid0; + if (!valid0) { + const _errs39 = errors; + const _errs40 = errors; + if (errors === _errs40) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing3; + if (data.type === undefined && (missing3 = 'type')) { + const err25 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/required', + keyword: 'required', + params: { missingProperty: missing3 }, + message: "must have required property '" + missing3 + "'", + }; + if (vErrors === null) { + vErrors = [err25]; + } else { + vErrors.push(err25); + } + errors++; + } else { + const _errs42 = errors; + for (const key3 in data) { + if ( + !( + key3 === 'description' || + key3 === 'name' || + key3 === 'type' + ) + ) { + const err26 = { + instancePath, + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key3 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err26]; + } else { + vErrors.push(err26); + } + errors++; + break; + } + } + if (_errs42 === errors) { + if (data.description !== undefined) { + const _errs43 = errors; + if (typeof data.description !== 'string') { + const err27 = { + instancePath: instancePath + '/description', + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err27]; + } else { + vErrors.push(err27); + } + errors++; + } + var valid8 = _errs43 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data.name !== undefined) { + const _errs45 = errors; + if (typeof data.name !== 'string') { + const err28 = { + instancePath: instancePath + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err28]; + } else { + vErrors.push(err28); + } + errors++; + } + var valid8 = _errs45 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data.type !== undefined) { + let data15 = data.type; + const _errs47 = errors; + if (typeof data15 !== 'string') { + const err29 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err29]; + } else { + vErrors.push(err29); + } + errors++; + } + if ('WalletData' !== data15) { + const err30 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/AuthenticationTemplateWalletData/properties/type/const', + keyword: 'const', + params: { allowedValue: 'WalletData' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err30]; + } else { + vErrors.push(err30); + } + errors++; + } + var valid8 = _errs47 === errors; + } else { + var valid8 = true; + } + } + } + } + } + } else { + const err31 = { + instancePath, + schemaPath: '#/definitions/AuthenticationTemplateWalletData/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err31]; + } else { + vErrors.push(err31); + } + errors++; + } + } + var _valid0 = _errs39 === errors; + valid0 = valid0 || _valid0; + } + } + } + if (!valid0) { + const err32 = { + instancePath, + schemaPath: '#/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err32]; + } else { + vErrors.push(err32); + } + errors++; + validate23.errors = vErrors; + return false; + } else { + errors = _errs0; + if (vErrors !== null) { + if (_errs0) { + vErrors.length = _errs0; + } else { + vErrors = null; + } + } + } + validate23.errors = vErrors; + return errors === 0; +} +function validate22( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'name' || + key0 === 'scripts' || + key0 === 'variables' + ) + ) { + validate22.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate22.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs4 = errors; + if (typeof data.name !== 'string') { + validate22.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.scripts !== undefined) { + let data2 = data.scripts; + const _errs6 = errors; + if (errors === _errs6) { + if (Array.isArray(data2)) { + var valid1 = true; + const len0 = data2.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs8 = errors; + if (typeof data2[i0] !== 'string') { + validate22.errors = [ + { + instancePath: instancePath + '/scripts/' + i0, + schemaPath: '#/properties/scripts/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid1 = _errs8 === errors; + if (!valid1) { + break; + } + } + } else { + validate22.errors = [ + { + instancePath: instancePath + '/scripts', + schemaPath: '#/properties/scripts/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.variables !== undefined) { + let data4 = data.variables; + const _errs10 = errors; + if (errors === _errs10) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key1 in data4) { + const _errs13 = errors; + if ( + !validate23(data4[key1], { + instancePath: + instancePath + + '/variables/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data4, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate23.errors + : vErrors.concat(validate23.errors); + errors = vErrors.length; + } + var valid2 = _errs13 === errors; + if (!valid2) { + break; + } + } + } else { + validate22.errors = [ + { + instancePath: instancePath + '/variables', + schemaPath: '#/properties/variables/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs10 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } else { + validate22.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate22.errors = vErrors; + return errors === 0; +} +const schema30 = { + additionalProperties: false, + description: + 'An object describing the configuration for a particular scenario within an authentication template.', + properties: { + data: { + $ref: '#/definitions/AuthenticationTemplateScenarioData', + description: + "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", + }, + description: { + description: + 'An optionally multi-line, free-form, human-readable description for this scenario (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + type: 'string', + }, + extends: { + description: + "The identifier of the scenario that this scenario extends. Any `data` or `transaction` properties not defined in this scenario inherit from the extended parent scenario.\n\nIf undefined, this scenario is assumed to extend the default scenario:\n\n- The default values for `data` are set: - The identifiers of all `Key` variables and entities in this template are lexicographically sorted, then each is assigned an incrementing positive integer – beginning with `1` – encoded as an unsigned, 256-bit, big-endian integer (i.e. `0x0000...0001` (32 bytes), `0x0000...0002`, `0x0000...0003`, etc.). For `Key`s, this assigned value is used as the private key; For entities, the assigned value is used as the master seed of that entity's `HdPrivateKey`. If `hdKey` is set, the `addressIndex` is set to `0`. - `currentBlockHeight` is set to `2`. This is the height of the second mined block after the genesis block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. This default value was chosen to be low enough to simplify the debugging of block height offsets while remaining differentiated from `0` and `1`, which are used both as boolean return values and for control flow. - `currentBlockTime` is set to `1231469665`. This is the Median Time-Past block time (BIP113) of block `2`.\n\n- Then `transaction` is set based on use: - if the scenario is being used for transaction estimation, all transaction properties are taken from the transaction being estimated. - if the scenario is being used for script testing and validation, the default value for each `transaction` property is used.\n\nWhen a scenario is extended, each property of `data` and `transaction` is extended individually: if the extending scenario does not provide a new value for `data.bytecode.value` or `transaction.property`, the parent value is used. To avoid inheriting a parent value, each child value must be individually overridden.", + type: 'string', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this scenario for use in user interfaces, e.g.: `Delayed Recovery`.', + type: 'string', + }, + sourceOutputs: { + description: + 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', + items: { + $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', + }, + type: 'array', + }, + transaction: { + additionalProperties: false, + description: + 'The transaction within which this scenario should be evaluated. This is used for script testing and validation.\n\nIf undefined, inherits the default value for each property: ```json { "inputs": [{ "unlockingBytecode": [\'slot\'] }], "locktime": 0, "outputs": [{ "lockingBytecode": {} }], "version": 2 } ```\n\nAny `transaction` property that is not set will be inherited from the scenario specified by `extends`. when specifying the `inputs` and `outputs` properties, each input and output extends the default values for inputs and outputs, respectively.\n\nFor example, an input of `{}` is interpreted as: ```json { "outpointIndex": 0, "outpointTransactionHash": "0000000000000000000000000000000000000000000000000000000000000000", "sequenceNumber": 0, "unlockingBytecode": [\'slot\'] } ``` And an output of `{}` is interpreted as: ```json { "lockingBytecode": { "script": [\'copy\'], "overrides": { "hdKeys": { "addressIndex": 1 } } }, "valueSatoshis": 0 } ```', + properties: { + inputs: { + description: + 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', + items: { $ref: '#/definitions/AuthenticationTemplateScenarioInput' }, + type: 'array', + }, + locktime: { + description: + 'The locktime to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, defaults to `0`.\n\nLocktime can be provided as either a timestamp or a block height. Values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`). Values greater than or equal to `500000000` are understood to be a UNIX timestamp.\n\nFor validating timestamp values, the median timestamp of the last 11 blocks (Median Time-Past) is used. The precise behavior is defined in BIP113.\n\nIf the `sequenceNumber` of every transaction input is set to `0xffffffff` (`4294967295`), locktime is disabled, and the transaction may be added to a block even if the specified locktime has not yet been reached. When locktime is disabled, if an `OP_CHECKLOCKTIMEVERIFY` operation is encountered during the verification of any input, an error is produced, and the transaction is invalid.', + type: 'number', + }, + outputs: { + description: + 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', + items: { + $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + }, + type: 'array', + }, + version: { + description: + 'The version to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, inherits the default scenario `version` value: `2`.', + type: 'number', + }, + }, + type: 'object', + }, + }, + type: 'object', +}; +const schema31 = { + additionalProperties: false, + description: 'An object defining the data to use while compiling a scenario.', + properties: { + bytecode: { + additionalProperties: { type: 'string' }, + description: + "A map of full identifiers to CashAssembly scripts that compile to each identifier's value for this scenario. Allowing `bytecode` to be specified as scripts (rather than e.g. hex) offers greater power and flexibility.\n\nBytecode scripts have access to each other and all other template scripts and defined variables, however, cyclical references will produce an error at compile time. Also, because the results of these compilations will be used to generate the compilation context for this scenario, these scripts may not use compiler operations that themselves require access to compilation context (e.g. signatures).\n\nThe provided `fullIdentifier` should match the complete identifier for each item, e.g. `some_wallet_data`, `variable_id.public_key`, or `variable_id.signature.all_outputs`.\n\nAll `AddressData` and `WalletData` variables must be provided via `bytecode` (though the default scenario automatically includes reasonable values), and pre-computed results for operations of other variable types (e.g. `key.public_key`) may also be provided via this property.\n\nBecause each bytecode identifier may precisely match the identifier of the variable it defines for this scenario, references between these scripts must refer to the target script with a `_scenario.` prefix. E.g. to reference a sibling script `my_foo` from `my_bar`, the `my_bar` script must use the identifier `_scenario.my_foo`.", + type: 'object', + }, + currentBlockHeight: { + description: + 'The current block height at the "address creation time" implied in this scenario.', + type: 'number', + }, + currentBlockTime: { + description: + 'The current MTP block time as a UNIX timestamp at the "address creation time" implied in this scenario.\n\nNote, this is never a current timestamp, but rather the median timestamp of the last 11 blocks. It is therefore approximately one hour in the past.\n\nEvery block has a precise MTP block time, much like a block height. See BIP113 for details.', + type: 'number', + }, + hdKeys: { + additionalProperties: false, + description: + 'An object describing the settings used for `HdKey` variables in this scenario.', + properties: { + addressIndex: { + description: + 'The current address index to be used for this scenario. The `addressIndex` gets added to each `HdKey`s `addressOffset` to calculate the dynamic index (`i`) used in each `privateDerivationPath` or `publicDerivationPath`.\n\nThis is required for any compiler operation that requires derivation. Typically, the value is incremented by one for each address in a wallet.\n\nDefaults to `0`.', + type: 'number', + }, + hdPrivateKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of entity IDs to master HD private keys. These master HD private keys are used to derive each `HdKey` variable assigned to that entity according to its `privateDerivationPath`.\n\nHD private keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.', + type: 'object', + }, + hdPublicKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of entity IDs to HD public keys. These HD public keys are used to derive public keys for each `HdKey` variable assigned to that entity according to its `publicDerivationPath`.\n\nHD public keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.', + type: 'object', + }, + }, + type: 'object', + }, + keys: { + additionalProperties: false, + description: + 'An object describing the settings used for `Key` variables in this scenario.', + properties: { + privateKeys: { + additionalProperties: { type: 'string' }, + description: + 'A map of `Key` variable IDs to their 32-byte, hexadecimal-encoded private key values.', + type: 'object', + }, + }, + type: 'object', + }, + }, + type: 'object', +}; +const schema32 = { + additionalProperties: false, + description: + 'An example output used to define a scenario for an authentication template.', + properties: { + lockingBytecode: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { + items: { const: 'slot', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', + }, + valueSatoshis: { + description: + 'The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `"ffffffffffffffff"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.', + type: ['number', 'string'], + }, + }, + type: 'object', +}; +const schema33 = { + anyOf: [ + { type: 'string' }, + { + additionalProperties: false, + properties: { + overrides: { + $ref: '#/definitions/AuthenticationTemplateScenarioData', + description: + 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', + }, + script: { + anyOf: [ + { type: 'string' }, + { + items: { const: 'copy', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The identifier of the script to compile when generating this bytecode. May also be set to `["copy"]`, which is automatically replaced with the identifier of the locking or unlocking script under test, respectively.\n\nIf undefined, defaults to `["copy"]`.', + }, + }, + type: 'object', + }, + ], + description: + 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', +}; +function validate28( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + const _errs0 = errors; + let valid0 = false; + const _errs1 = errors; + if (typeof data !== 'string') { + const err0 = { + instancePath, + schemaPath: '#/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs1 === errors; + valid0 = valid0 || _valid0; + if (!valid0) { + const _errs3 = errors; + if (errors === _errs3) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs5 = errors; + for (const key0 in data) { + if (!(key0 === 'overrides' || key0 === 'script')) { + const err1 = { + instancePath, + schemaPath: '#/anyOf/1/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + break; + } + } + if (_errs5 === errors) { + if (data.overrides !== undefined) { + let data0 = data.overrides; + const _errs6 = errors; + const _errs7 = errors; + if (errors === _errs7) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + const _errs9 = errors; + for (const key1 in data0) { + if ( + !( + key1 === 'bytecode' || + key1 === 'currentBlockHeight' || + key1 === 'currentBlockTime' || + key1 === 'hdKeys' || + key1 === 'keys' + ) + ) { + const err2 = { + instancePath: instancePath + '/overrides', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key1 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + break; + } + } + if (_errs9 === errors) { + if (data0.bytecode !== undefined) { + let data1 = data0.bytecode; + const _errs10 = errors; + if (errors === _errs10) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key2 in data1) { + const _errs13 = errors; + if (typeof data1[key2] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/overrides/bytecode/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid4 = _errs13 === errors; + if (!valid4) { + break; + } + } + } else { + const err4 = { + instancePath: instancePath + '/overrides/bytecode', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid3 = _errs10 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data0.currentBlockHeight !== undefined) { + let data3 = data0.currentBlockHeight; + const _errs15 = errors; + if (!(typeof data3 == 'number' && isFinite(data3))) { + const err5 = { + instancePath: + instancePath + '/overrides/currentBlockHeight', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + var valid3 = _errs15 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data0.currentBlockTime !== undefined) { + let data4 = data0.currentBlockTime; + const _errs17 = errors; + if (!(typeof data4 == 'number' && isFinite(data4))) { + const err6 = { + instancePath: + instancePath + '/overrides/currentBlockTime', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + } + var valid3 = _errs17 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data0.hdKeys !== undefined) { + let data5 = data0.hdKeys; + const _errs19 = errors; + if (errors === _errs19) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + const _errs21 = errors; + for (const key3 in data5) { + if ( + !( + key3 === 'addressIndex' || + key3 === 'hdPrivateKeys' || + key3 === 'hdPublicKeys' + ) + ) { + const err7 = { + instancePath: + instancePath + '/overrides/hdKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key3 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + break; + } + } + if (_errs21 === errors) { + if (data5.addressIndex !== undefined) { + let data6 = data5.addressIndex; + const _errs22 = errors; + if ( + !( + typeof data6 == 'number' && + isFinite(data6) + ) + ) { + const err8 = { + instancePath: + instancePath + + '/overrides/hdKeys/addressIndex', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + } + var valid5 = _errs22 === errors; + } else { + var valid5 = true; + } + if (valid5) { + if (data5.hdPrivateKeys !== undefined) { + let data7 = data5.hdPrivateKeys; + const _errs24 = errors; + if (errors === _errs24) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key4 in data7) { + const _errs27 = errors; + if (typeof data7[key4] !== 'string') { + const err9 = { + instancePath: + instancePath + + '/overrides/hdKeys/hdPrivateKeys/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err9]; + } else { + vErrors.push(err9); + } + errors++; + } + var valid6 = _errs27 === errors; + if (!valid6) { + break; + } + } + } else { + const err10 = { + instancePath: + instancePath + + '/overrides/hdKeys/hdPrivateKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err10]; + } else { + vErrors.push(err10); + } + errors++; + } + } + var valid5 = _errs24 === errors; + } else { + var valid5 = true; + } + if (valid5) { + if (data5.hdPublicKeys !== undefined) { + let data9 = data5.hdPublicKeys; + const _errs29 = errors; + if (errors === _errs29) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs32 = errors; + if ( + typeof data9[key5] !== 'string' + ) { + const err11 = { + instancePath: + instancePath + + '/overrides/hdKeys/hdPublicKeys/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err11]; + } else { + vErrors.push(err11); + } + errors++; + } + var valid7 = _errs32 === errors; + if (!valid7) { + break; + } + } + } else { + const err12 = { + instancePath: + instancePath + + '/overrides/hdKeys/hdPublicKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err12]; + } else { + vErrors.push(err12); + } + errors++; + } + } + var valid5 = _errs29 === errors; + } else { + var valid5 = true; + } + } + } + } + } else { + const err13 = { + instancePath: + instancePath + '/overrides/hdKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err13]; + } else { + vErrors.push(err13); + } + errors++; + } + } + var valid3 = _errs19 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data0.keys !== undefined) { + let data11 = data0.keys; + const _errs34 = errors; + if (errors === _errs34) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + const _errs36 = errors; + for (const key6 in data11) { + if (!(key6 === 'privateKeys')) { + const err14 = { + instancePath: + instancePath + '/overrides/keys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key6 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err14]; + } else { + vErrors.push(err14); + } + errors++; + break; + } + } + if (_errs36 === errors) { + if (data11.privateKeys !== undefined) { + let data12 = data11.privateKeys; + const _errs37 = errors; + if (errors === _errs37) { + if ( + data12 && + typeof data12 == 'object' && + !Array.isArray(data12) + ) { + for (const key7 in data12) { + const _errs40 = errors; + if ( + typeof data12[key7] !== 'string' + ) { + const err15 = { + instancePath: + instancePath + + '/overrides/keys/privateKeys/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err15]; + } else { + vErrors.push(err15); + } + errors++; + } + var valid9 = _errs40 === errors; + if (!valid9) { + break; + } + } + } else { + const err16 = { + instancePath: + instancePath + + '/overrides/keys/privateKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + } + } + } + } else { + const err17 = { + instancePath: + instancePath + '/overrides/keys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + } + var valid3 = _errs34 === errors; + } else { + var valid3 = true; + } + } + } + } + } + } + } else { + const err18 = { + instancePath: instancePath + '/overrides', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err18]; + } else { + vErrors.push(err18); + } + errors++; + } + } + var valid1 = _errs6 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data.script !== undefined) { + let data14 = data.script; + const _errs42 = errors; + const _errs43 = errors; + let valid10 = false; + const _errs44 = errors; + if (typeof data14 !== 'string') { + const err19 = { + instancePath: instancePath + '/script', + schemaPath: '#/anyOf/1/properties/script/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err19]; + } else { + vErrors.push(err19); + } + errors++; + } + var _valid1 = _errs44 === errors; + valid10 = valid10 || _valid1; + if (!valid10) { + const _errs46 = errors; + if (errors === _errs46) { + if (Array.isArray(data14)) { + if (data14.length > 1) { + const err20 = { + instancePath: instancePath + '/script', + schemaPath: + '#/anyOf/1/properties/script/anyOf/1/maxItems', + keyword: 'maxItems', + params: { limit: 1 }, + message: 'must NOT have more than 1 items', + }; + if (vErrors === null) { + vErrors = [err20]; + } else { + vErrors.push(err20); + } + errors++; + } else { + if (data14.length < 1) { + const err21 = { + instancePath: instancePath + '/script', + schemaPath: + '#/anyOf/1/properties/script/anyOf/1/minItems', + keyword: 'minItems', + params: { limit: 1 }, + message: 'must NOT have fewer than 1 items', + }; + if (vErrors === null) { + vErrors = [err21]; + } else { + vErrors.push(err21); + } + errors++; + } else { + var valid11 = true; + const len0 = data14.length; + for (let i0 = 0; i0 < len0; i0++) { + let data15 = data14[i0]; + const _errs48 = errors; + if (typeof data15 !== 'string') { + const err22 = { + instancePath: instancePath + '/script/' + i0, + schemaPath: + '#/anyOf/1/properties/script/anyOf/1/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err22]; + } else { + vErrors.push(err22); + } + errors++; + } + if ('copy' !== data15) { + const err23 = { + instancePath: instancePath + '/script/' + i0, + schemaPath: + '#/anyOf/1/properties/script/anyOf/1/items/const', + keyword: 'const', + params: { allowedValue: 'copy' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err23]; + } else { + vErrors.push(err23); + } + errors++; + } + var valid11 = _errs48 === errors; + if (!valid11) { + break; + } + } + } + } + } else { + const err24 = { + instancePath: instancePath + '/script', + schemaPath: '#/anyOf/1/properties/script/anyOf/1/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }; + if (vErrors === null) { + vErrors = [err24]; + } else { + vErrors.push(err24); + } + errors++; + } + } + var _valid1 = _errs46 === errors; + valid10 = valid10 || _valid1; + } + if (!valid10) { + const err25 = { + instancePath: instancePath + '/script', + schemaPath: '#/anyOf/1/properties/script/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err25]; + } else { + vErrors.push(err25); + } + errors++; + } else { + errors = _errs43; + if (vErrors !== null) { + if (_errs43) { + vErrors.length = _errs43; + } else { + vErrors = null; + } + } + } + var valid1 = _errs42 === errors; + } else { + var valid1 = true; + } + } + } + } else { + const err26 = { + instancePath, + schemaPath: '#/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err26]; + } else { + vErrors.push(err26); + } + errors++; + } + } + var _valid0 = _errs3 === errors; + valid0 = valid0 || _valid0; + } + if (!valid0) { + const err27 = { + instancePath, + schemaPath: '#/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err27]; + } else { + vErrors.push(err27); + } + errors++; + validate28.errors = vErrors; + return false; + } else { + errors = _errs0; + if (vErrors !== null) { + if (_errs0) { + vErrors.length = _errs0; + } else { + vErrors = null; + } + } + } + validate28.errors = vErrors; + return errors === 0; +} +function validate27( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'lockingBytecode' || key0 === 'valueSatoshis')) { + validate27.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.lockingBytecode !== undefined) { + let data0 = data.lockingBytecode; + const _errs2 = errors; + const _errs3 = errors; + let valid1 = false; + const _errs4 = errors; + if ( + !validate28(data0, { + instancePath: instancePath + '/lockingBytecode', + parentData: data, + parentDataProperty: 'lockingBytecode', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate28.errors + : vErrors.concat(validate28.errors); + errors = vErrors.length; + } + var _valid0 = _errs4 === errors; + valid1 = valid1 || _valid0; + if (!valid1) { + const _errs5 = errors; + if (errors === _errs5) { + if (Array.isArray(data0)) { + if (data0.length > 1) { + const err0 = { + instancePath: instancePath + '/lockingBytecode', + schemaPath: '#/properties/lockingBytecode/anyOf/1/maxItems', + keyword: 'maxItems', + params: { limit: 1 }, + message: 'must NOT have more than 1 items', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + if (data0.length < 1) { + const err1 = { + instancePath: instancePath + '/lockingBytecode', + schemaPath: + '#/properties/lockingBytecode/anyOf/1/minItems', + keyword: 'minItems', + params: { limit: 1 }, + message: 'must NOT have fewer than 1 items', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } else { + var valid2 = true; + const len0 = data0.length; + for (let i0 = 0; i0 < len0; i0++) { + let data1 = data0[i0]; + const _errs7 = errors; + if (typeof data1 !== 'string') { + const err2 = { + instancePath: instancePath + '/lockingBytecode/' + i0, + schemaPath: + '#/properties/lockingBytecode/anyOf/1/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + if ('slot' !== data1) { + const err3 = { + instancePath: instancePath + '/lockingBytecode/' + i0, + schemaPath: + '#/properties/lockingBytecode/anyOf/1/items/const', + keyword: 'const', + params: { allowedValue: 'slot' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid2 = _errs7 === errors; + if (!valid2) { + break; + } + } + } + } + } else { + const err4 = { + instancePath: instancePath + '/lockingBytecode', + schemaPath: '#/properties/lockingBytecode/anyOf/1/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var _valid0 = _errs5 === errors; + valid1 = valid1 || _valid0; + } + if (!valid1) { + const err5 = { + instancePath: instancePath + '/lockingBytecode', + schemaPath: '#/properties/lockingBytecode/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + validate27.errors = vErrors; + return false; + } else { + errors = _errs3; + if (vErrors !== null) { + if (_errs3) { + vErrors.length = _errs3; + } else { + vErrors = null; + } + } + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.valueSatoshis !== undefined) { + let data2 = data.valueSatoshis; + const _errs9 = errors; + if ( + !(typeof data2 == 'number' && isFinite(data2)) && + typeof data2 !== 'string' + ) { + validate27.errors = [ + { + instancePath: instancePath + '/valueSatoshis', + schemaPath: '#/properties/valueSatoshis/type', + keyword: 'type', + params: { type: schema32.properties.valueSatoshis.type }, + message: 'must be number,string', + }, + ]; + return false; + } + var valid0 = _errs9 === errors; + } else { + var valid0 = true; + } + } + } + } else { + validate27.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate27.errors = vErrors; + return errors === 0; +} +const schema35 = { + additionalProperties: false, + description: + 'An example input used to define a scenario for an authentication template.', + properties: { + outpointIndex: { + description: + 'The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to the same index as the input itself (so that by default, every outpoint in the produced transaction is different, even if an empty `outpointTransactionHash` is used for each transaction).', + type: 'number', + }, + outpointTransactionHash: { + description: + 'A 32-byte, hexadecimal-encoded hash of the transaction from which this input is spent in big-endian byte order. This is the byte order typically seen in block explorers and user interfaces (as opposed to little-endian byte order, which is used in standard P2P network messages).\n\nIf undefined, this defaults to the "empty" hash: `0000000000000000000000000000000000000000000000000000000000000000`\n\nA.K.A. Outpoint `Transaction ID`', + type: 'string', + }, + sequenceNumber: { + description: + 'The positive, 32-bit unsigned integer used as the "sequence number" for this input.\n\nIf undefined, this defaults to `0`.', + type: 'number', + }, + unlockingBytecode: { + anyOf: [ + { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { + items: { const: 'slot', type: 'string' }, + maxItems: 1, + minItems: 1, + type: 'array', + }, + ], + description: + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + }, + }, + type: 'object', +}; +function validate31( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'outpointIndex' || + key0 === 'outpointTransactionHash' || + key0 === 'sequenceNumber' || + key0 === 'unlockingBytecode' + ) + ) { + validate31.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.outpointIndex !== undefined) { + let data0 = data.outpointIndex; + const _errs2 = errors; + if (!(typeof data0 == 'number' && isFinite(data0))) { + validate31.errors = [ + { + instancePath: instancePath + '/outpointIndex', + schemaPath: '#/properties/outpointIndex/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.outpointTransactionHash !== undefined) { + const _errs4 = errors; + if (typeof data.outpointTransactionHash !== 'string') { + validate31.errors = [ + { + instancePath: instancePath + '/outpointTransactionHash', + schemaPath: '#/properties/outpointTransactionHash/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.sequenceNumber !== undefined) { + let data2 = data.sequenceNumber; + const _errs6 = errors; + if (!(typeof data2 == 'number' && isFinite(data2))) { + validate31.errors = [ + { + instancePath: instancePath + '/sequenceNumber', + schemaPath: '#/properties/sequenceNumber/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.unlockingBytecode !== undefined) { + let data3 = data.unlockingBytecode; + const _errs8 = errors; + const _errs9 = errors; + let valid1 = false; + const _errs10 = errors; + if ( + !validate28(data3, { + instancePath: instancePath + '/unlockingBytecode', + parentData: data, + parentDataProperty: 'unlockingBytecode', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate28.errors + : vErrors.concat(validate28.errors); + errors = vErrors.length; + } + var _valid0 = _errs10 === errors; + valid1 = valid1 || _valid0; + if (!valid1) { + const _errs11 = errors; + if (errors === _errs11) { + if (Array.isArray(data3)) { + if (data3.length > 1) { + const err0 = { + instancePath: instancePath + '/unlockingBytecode', + schemaPath: + '#/properties/unlockingBytecode/anyOf/1/maxItems', + keyword: 'maxItems', + params: { limit: 1 }, + message: 'must NOT have more than 1 items', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + if (data3.length < 1) { + const err1 = { + instancePath: instancePath + '/unlockingBytecode', + schemaPath: + '#/properties/unlockingBytecode/anyOf/1/minItems', + keyword: 'minItems', + params: { limit: 1 }, + message: 'must NOT have fewer than 1 items', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } else { + var valid2 = true; + const len0 = data3.length; + for (let i0 = 0; i0 < len0; i0++) { + let data4 = data3[i0]; + const _errs13 = errors; + if (typeof data4 !== 'string') { + const err2 = { + instancePath: + instancePath + '/unlockingBytecode/' + i0, + schemaPath: + '#/properties/unlockingBytecode/anyOf/1/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + if ('slot' !== data4) { + const err3 = { + instancePath: + instancePath + '/unlockingBytecode/' + i0, + schemaPath: + '#/properties/unlockingBytecode/anyOf/1/items/const', + keyword: 'const', + params: { allowedValue: 'slot' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid2 = _errs13 === errors; + if (!valid2) { + break; + } + } + } + } + } else { + const err4 = { + instancePath: instancePath + '/unlockingBytecode', + schemaPath: + '#/properties/unlockingBytecode/anyOf/1/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var _valid0 = _errs11 === errors; + valid1 = valid1 || _valid0; + } + if (!valid1) { + const err5 = { + instancePath: instancePath + '/unlockingBytecode', + schemaPath: '#/properties/unlockingBytecode/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + validate31.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid0 = _errs8 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } else { + validate31.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate31.errors = vErrors; + return errors === 0; +} +const schema36 = { + additionalProperties: false, + description: + 'An example output used to define a scenario for an authentication template.', + properties: { + lockingBytecode: { + $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + description: + 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', + }, + valueSatoshis: { + description: + 'The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `"ffffffffffffffff"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.', + type: ['number', 'string'], + }, + }, + type: 'object', +}; +function validate34( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'lockingBytecode' || key0 === 'valueSatoshis')) { + validate34.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.lockingBytecode !== undefined) { + const _errs2 = errors; + if ( + !validate28(data.lockingBytecode, { + instancePath: instancePath + '/lockingBytecode', + parentData: data, + parentDataProperty: 'lockingBytecode', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate28.errors + : vErrors.concat(validate28.errors); + errors = vErrors.length; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.valueSatoshis !== undefined) { + let data1 = data.valueSatoshis; + const _errs3 = errors; + if ( + !(typeof data1 == 'number' && isFinite(data1)) && + typeof data1 !== 'string' + ) { + validate34.errors = [ + { + instancePath: instancePath + '/valueSatoshis', + schemaPath: '#/properties/valueSatoshis/type', + keyword: 'type', + params: { type: schema36.properties.valueSatoshis.type }, + message: 'must be number,string', + }, + ]; + return false; + } + var valid0 = _errs3 === errors; + } else { + var valid0 = true; + } + } + } + } else { + validate34.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate34.errors = vErrors; + return errors === 0; +} +function validate26( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'data' || + key0 === 'description' || + key0 === 'extends' || + key0 === 'name' || + key0 === 'sourceOutputs' || + key0 === 'transaction' + ) + ) { + validate26.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.data !== undefined) { + let data0 = data.data; + const _errs2 = errors; + const _errs3 = errors; + if (errors === _errs3) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + const _errs5 = errors; + for (const key1 in data0) { + if ( + !( + key1 === 'bytecode' || + key1 === 'currentBlockHeight' || + key1 === 'currentBlockTime' || + key1 === 'hdKeys' || + key1 === 'keys' + ) + ) { + validate26.errors = [ + { + instancePath: instancePath + '/data', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key1 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs5 === errors) { + if (data0.bytecode !== undefined) { + let data1 = data0.bytecode; + const _errs6 = errors; + if (errors === _errs6) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key2 in data1) { + const _errs9 = errors; + if (typeof data1[key2] !== 'string') { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/bytecode/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid3 = _errs9 === errors; + if (!valid3) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/data/bytecode', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid2 = _errs6 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data0.currentBlockHeight !== undefined) { + let data3 = data0.currentBlockHeight; + const _errs11 = errors; + if (!(typeof data3 == 'number' && isFinite(data3))) { + validate26.errors = [ + { + instancePath: + instancePath + '/data/currentBlockHeight', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid2 = _errs11 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data0.currentBlockTime !== undefined) { + let data4 = data0.currentBlockTime; + const _errs13 = errors; + if (!(typeof data4 == 'number' && isFinite(data4))) { + validate26.errors = [ + { + instancePath: + instancePath + '/data/currentBlockTime', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid2 = _errs13 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data0.hdKeys !== undefined) { + let data5 = data0.hdKeys; + const _errs15 = errors; + if (errors === _errs15) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + const _errs17 = errors; + for (const key3 in data5) { + if ( + !( + key3 === 'addressIndex' || + key3 === 'hdPrivateKeys' || + key3 === 'hdPublicKeys' + ) + ) { + validate26.errors = [ + { + instancePath: instancePath + '/data/hdKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key3 }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs17 === errors) { + if (data5.addressIndex !== undefined) { + let data6 = data5.addressIndex; + const _errs18 = errors; + if ( + !(typeof data6 == 'number' && isFinite(data6)) + ) { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/hdKeys/addressIndex', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid4 = _errs18 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data5.hdPrivateKeys !== undefined) { + let data7 = data5.hdPrivateKeys; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key4 in data7) { + const _errs23 = errors; + if (typeof data7[key4] !== 'string') { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/hdKeys/hdPrivateKeys/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid5 = _errs23 === errors; + if (!valid5) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/hdKeys/hdPrivateKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid4 = _errs20 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data5.hdPublicKeys !== undefined) { + let data9 = data5.hdPublicKeys; + const _errs25 = errors; + if (errors === _errs25) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs28 = errors; + if (typeof data9[key5] !== 'string') { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/hdKeys/hdPublicKeys/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid6 = _errs28 === errors; + if (!valid6) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/hdKeys/hdPublicKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid4 = _errs25 === errors; + } else { + var valid4 = true; + } + } + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/data/hdKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid2 = _errs15 === errors; + } else { + var valid2 = true; + } + if (valid2) { + if (data0.keys !== undefined) { + let data11 = data0.keys; + const _errs30 = errors; + if (errors === _errs30) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + const _errs32 = errors; + for (const key6 in data11) { + if (!(key6 === 'privateKeys')) { + validate26.errors = [ + { + instancePath: instancePath + '/data/keys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key6 }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs32 === errors) { + if (data11.privateKeys !== undefined) { + let data12 = data11.privateKeys; + const _errs33 = errors; + if (errors === _errs33) { + if ( + data12 && + typeof data12 == 'object' && + !Array.isArray(data12) + ) { + for (const key7 in data12) { + const _errs36 = errors; + if (typeof data12[key7] !== 'string') { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/keys/privateKeys/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid8 = _errs36 === errors; + if (!valid8) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: + instancePath + + '/data/keys/privateKeys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/data/keys', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid2 = _errs30 === errors; + } else { + var valid2 = true; + } + } + } + } + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/data', + schemaPath: + '#/definitions/AuthenticationTemplateScenarioData/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.description !== undefined) { + const _errs38 = errors; + if (typeof data.description !== 'string') { + validate26.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs38 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extends !== undefined) { + const _errs40 = errors; + if (typeof data.extends !== 'string') { + validate26.errors = [ + { + instancePath: instancePath + '/extends', + schemaPath: '#/properties/extends/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs40 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs42 = errors; + if (typeof data.name !== 'string') { + validate26.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs42 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.sourceOutputs !== undefined) { + let data17 = data.sourceOutputs; + const _errs44 = errors; + if (errors === _errs44) { + if (Array.isArray(data17)) { + var valid9 = true; + const len0 = data17.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs46 = errors; + if ( + !validate27(data17[i0], { + instancePath: instancePath + '/sourceOutputs/' + i0, + parentData: data17, + parentDataProperty: i0, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate27.errors + : vErrors.concat(validate27.errors); + errors = vErrors.length; + } + var valid9 = _errs46 === errors; + if (!valid9) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/sourceOutputs', + schemaPath: '#/properties/sourceOutputs/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs44 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.transaction !== undefined) { + let data19 = data.transaction; + const _errs47 = errors; + if (errors === _errs47) { + if ( + data19 && + typeof data19 == 'object' && + !Array.isArray(data19) + ) { + const _errs49 = errors; + for (const key8 in data19) { + if ( + !( + key8 === 'inputs' || + key8 === 'locktime' || + key8 === 'outputs' || + key8 === 'version' + ) + ) { + validate26.errors = [ + { + instancePath: instancePath + '/transaction', + schemaPath: + '#/properties/transaction/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key8 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs49 === errors) { + if (data19.inputs !== undefined) { + let data20 = data19.inputs; + const _errs50 = errors; + if (errors === _errs50) { + if (Array.isArray(data20)) { + var valid11 = true; + const len1 = data20.length; + for (let i1 = 0; i1 < len1; i1++) { + const _errs52 = errors; + if ( + !validate31(data20[i1], { + instancePath: + instancePath + + '/transaction/inputs/' + + i1, + parentData: data20, + parentDataProperty: i1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate31.errors + : vErrors.concat(validate31.errors); + errors = vErrors.length; + } + var valid11 = _errs52 === errors; + if (!valid11) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: + instancePath + '/transaction/inputs', + schemaPath: + '#/properties/transaction/properties/inputs/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid10 = _errs50 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if (data19.locktime !== undefined) { + let data22 = data19.locktime; + const _errs53 = errors; + if ( + !(typeof data22 == 'number' && isFinite(data22)) + ) { + validate26.errors = [ + { + instancePath: + instancePath + '/transaction/locktime', + schemaPath: + '#/properties/transaction/properties/locktime/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid10 = _errs53 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if (data19.outputs !== undefined) { + let data23 = data19.outputs; + const _errs55 = errors; + if (errors === _errs55) { + if (Array.isArray(data23)) { + var valid12 = true; + const len2 = data23.length; + for (let i2 = 0; i2 < len2; i2++) { + const _errs57 = errors; + if ( + !validate34(data23[i2], { + instancePath: + instancePath + + '/transaction/outputs/' + + i2, + parentData: data23, + parentDataProperty: i2, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate34.errors + : vErrors.concat(validate34.errors); + errors = vErrors.length; + } + var valid12 = _errs57 === errors; + if (!valid12) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath: + instancePath + '/transaction/outputs', + schemaPath: + '#/properties/transaction/properties/outputs/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid10 = _errs55 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if (data19.version !== undefined) { + let data25 = data19.version; + const _errs58 = errors; + if ( + !( + typeof data25 == 'number' && + isFinite(data25) + ) + ) { + validate26.errors = [ + { + instancePath: + instancePath + '/transaction/version', + schemaPath: + '#/properties/transaction/properties/version/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid10 = _errs58 === errors; + } else { + var valid10 = true; + } + } + } + } + } + } else { + validate26.errors = [ + { + instancePath: instancePath + '/transaction', + schemaPath: '#/properties/transaction/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs47 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } else { + validate26.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate26.errors = vErrors; + return errors === 0; +} +const schema39 = { + additionalProperties: false, + properties: { + name: { + description: + 'A single-line, human-readable name for this script (for use in user interfaces).', + type: 'string', + }, + pushed: { + description: + 'If set to `true`, indicates that this script should be wrapped in a push statement for testing.\n\nThis is useful for scripts that serve as "bytecode templates" – e.g. formatted messages or signature preimages. These scripts are typically not evaluated as bytecode but appear within push statements elsewhere in the template.\n\nDefaults to `false`.', + type: 'boolean', + }, + script: { + description: 'The script definition in CashAssembly.', + type: 'string', + }, + tests: { + additionalProperties: { + $ref: '#/definitions/AuthenticationTemplateScriptTest', + }, + description: + 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', + type: 'object', + }, + }, + required: ['script', 'tests'], + type: 'object', +}; +const schema40 = { + additionalProperties: false, + properties: { + check: { + description: + 'The script to evaluate after the script being tested. This can be used to check that the tested script leaves the expected results on the stack. For example, if the tested script is expected to leave 3 items of a specific size on the stack, the `check` script could pop each resulting item from the stack and examine it for correctness.\n\nIn scenario testing, this script is appended to the script under test, and together they are treated as the locking script. Program evaluation is considered successful if the resulting program state can be verified by the virtual machine (e.g. the resulting stack contains a single `1`, no errors are produced, etc.).', + type: 'string', + }, + fails: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that fails program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + invalid: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in a compilation error. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'A single-line, Title Case, human-readable name for this test (for use in user interfaces).', + type: 'string', + }, + passes: { + description: + 'A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that passes program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.', + items: { type: 'string' }, + type: 'array', + }, + setup: { + description: + 'A script to evaluate before the script being tested. This can be used to push values to the stack that are operated on by the tested script.\n\nIn scenario testing, this script is treated as the unlocking script.', + type: 'string', + }, + }, + required: ['check'], + type: 'object', +}; +function validate38( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.script === undefined && (missing0 = 'script')) || + (data.tests === undefined && (missing0 = 'tests')) + ) { + validate38.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'name' || + key0 === 'pushed' || + key0 === 'script' || + key0 === 'tests' + ) + ) { + validate38.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.name !== undefined) { + const _errs2 = errors; + if (typeof data.name !== 'string') { + validate38.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.pushed !== undefined) { + const _errs4 = errors; + if (typeof data.pushed !== 'boolean') { + validate38.errors = [ + { + instancePath: instancePath + '/pushed', + schemaPath: '#/properties/pushed/type', + keyword: 'type', + params: { type: 'boolean' }, + message: 'must be boolean', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.script !== undefined) { + const _errs6 = errors; + if (typeof data.script !== 'string') { + validate38.errors = [ + { + instancePath: instancePath + '/script', + schemaPath: '#/properties/script/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tests !== undefined) { + let data3 = data.tests; + const _errs8 = errors; + if (errors === _errs8) { + if ( + data3 && + typeof data3 == 'object' && + !Array.isArray(data3) + ) { + for (const key1 in data3) { + let data4 = data3[key1]; + const _errs11 = errors; + const _errs12 = errors; + if (errors === _errs12) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + let missing1; + if ( + data4.check === undefined && + (missing1 = 'check') + ) { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }, + ]; + return false; + } else { + const _errs14 = errors; + for (const key2 in data4) { + if ( + !( + key2 === 'check' || + key2 === 'fails' || + key2 === 'invalid' || + key2 === 'name' || + key2 === 'passes' || + key2 === 'setup' + ) + ) { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key2 }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs14 === errors) { + if (data4.check !== undefined) { + const _errs15 = errors; + if (typeof data4.check !== 'string') { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/check', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/check/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid3 = _errs15 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data4.fails !== undefined) { + let data6 = data4.fails; + const _errs17 = errors; + if (errors === _errs17) { + if (Array.isArray(data6)) { + var valid4 = true; + const len0 = data6.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs19 = errors; + if (typeof data6[i0] !== 'string') { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/fails/' + + i0, + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/fails/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid4 = _errs19 === errors; + if (!valid4) { + break; + } + } + } else { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/fails', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/fails/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid3 = _errs17 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data4.invalid !== undefined) { + let data8 = data4.invalid; + const _errs21 = errors; + if (errors === _errs21) { + if (Array.isArray(data8)) { + var valid5 = true; + const len1 = data8.length; + for (let i1 = 0; i1 < len1; i1++) { + const _errs23 = errors; + if (typeof data8[i1] !== 'string') { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/invalid/' + + i1, + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid5 = _errs23 === errors; + if (!valid5) { + break; + } + } + } else { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/invalid', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid3 = _errs21 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data4.name !== undefined) { + const _errs25 = errors; + if (typeof data4.name !== 'string') { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid3 = _errs25 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data4.passes !== undefined) { + let data11 = data4.passes; + const _errs27 = errors; + if (errors === _errs27) { + if (Array.isArray(data11)) { + var valid6 = true; + const len2 = data11.length; + for ( + let i2 = 0; + i2 < len2; + i2++ + ) { + const _errs29 = errors; + if ( + typeof data11[i2] !== 'string' + ) { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace( + /\//g, + '~1' + ) + + '/passes/' + + i2, + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/passes/items/type', + keyword: 'type', + params: { + type: 'string', + }, + message: 'must be string', + }, + ]; + return false; + } + var valid6 = _errs29 === errors; + if (!valid6) { + break; + } + } + } else { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/passes', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/passes/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid3 = _errs27 === errors; + } else { + var valid3 = true; + } + if (valid3) { + if (data4.setup !== undefined) { + const _errs31 = errors; + if ( + typeof data4.setup !== 'string' + ) { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/setup', + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/properties/setup/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid3 = _errs31 === errors; + } else { + var valid3 = true; + } + } + } + } + } + } + } + } + } else { + validate38.errors = [ + { + instancePath: + instancePath + + '/tests/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptTest/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid1 = _errs11 === errors; + if (!valid1) { + break; + } + } + } else { + validate38.errors = [ + { + instancePath: instancePath + '/tests', + schemaPath: '#/properties/tests/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs8 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } else { + validate38.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate38.errors = vErrors; + return errors === 0; +} +const func4 = Object.prototype.hasOwnProperty; +function validate21( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.entities === undefined && (missing0 = 'entities')) || + (data.scripts === undefined && (missing0 = 'scripts')) || + (data.supported === undefined && (missing0 = 'supported')) || + (data.version === undefined && (missing0 = 'version')) + ) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === '$schema' || + key0 === 'description' || + key0 === 'entities' || + key0 === 'name' || + key0 === 'scenarios' || + key0 === 'scripts' || + key0 === 'supported' || + key0 === 'version' + ) + ) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.$schema !== undefined) { + const _errs2 = errors; + if (typeof data.$schema !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/$schema', + schemaPath: '#/properties/%24schema/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.description !== undefined) { + const _errs4 = errors; + if (typeof data.description !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.entities !== undefined) { + let data2 = data.entities; + const _errs6 = errors; + if (errors === _errs6) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key1 in data2) { + const _errs9 = errors; + if ( + !validate22(data2[key1], { + instancePath: + instancePath + + '/entities/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data2, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate22.errors + : vErrors.concat(validate22.errors); + errors = vErrors.length; + } + var valid1 = _errs9 === errors; + if (!valid1) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/entities', + schemaPath: '#/properties/entities/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs10 = errors; + if (typeof data.name !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs10 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.scenarios !== undefined) { + let data5 = data.scenarios; + const _errs12 = errors; + if (errors === _errs12) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + for (const key2 in data5) { + const _errs15 = errors; + if ( + !validate26(data5[key2], { + instancePath: + instancePath + + '/scenarios/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data5, + parentDataProperty: key2, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate26.errors + : vErrors.concat(validate26.errors); + errors = vErrors.length; + } + var valid2 = _errs15 === errors; + if (!valid2) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/scenarios', + schemaPath: '#/properties/scenarios/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs12 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.scripts !== undefined) { + let data7 = data.scripts; + const _errs16 = errors; + if (errors === _errs16) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key3 in data7) { + let data8 = data7[key3]; + const _errs19 = errors; + const _errs20 = errors; + let valid4 = false; + const _errs21 = errors; + const _errs22 = errors; + if (errors === _errs22) { + if ( + data8 && + typeof data8 == 'object' && + !Array.isArray(data8) + ) { + let missing1; + if ( + data8.script === undefined && + (missing1 = 'script') + ) { + const err0 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScript/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + const _errs24 = errors; + for (const key4 in data8) { + if ( + !(key4 === 'name' || key4 === 'script') + ) { + const err1 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScript/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key4 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + break; + } + } + if (_errs24 === errors) { + if (data8.name !== undefined) { + const _errs25 = errors; + if (typeof data8.name !== 'string') { + const err2 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateScript/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + var valid6 = _errs25 === errors; + } else { + var valid6 = true; + } + if (valid6) { + if (data8.script !== undefined) { + const _errs27 = errors; + if (typeof data8.script !== 'string') { + const err3 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/script', + schemaPath: + '#/definitions/AuthenticationTemplateScript/properties/script/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs27 === errors; + } else { + var valid6 = true; + } + } + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScript/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var _valid0 = _errs21 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs29 = errors; + const _errs30 = errors; + if (errors === _errs30) { + if ( + data8 && + typeof data8 == 'object' && + !Array.isArray(data8) + ) { + let missing2; + if ( + (data8.lockingType === undefined && + (missing2 = 'lockingType')) || + (data8.script === undefined && + (missing2 = 'script')) + ) { + const err5 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/required', + keyword: 'required', + params: { missingProperty: missing2 }, + message: + "must have required property '" + + missing2 + + "'", + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } else { + const _errs32 = errors; + for (const key5 in data8) { + if ( + !( + key5 === 'lockingType' || + key5 === 'name' || + key5 === 'script' + ) + ) { + const err6 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key5 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + break; + } + } + if (_errs32 === errors) { + if (data8.lockingType !== undefined) { + let data11 = data8.lockingType; + const _errs33 = errors; + if (typeof data11 !== 'string') { + const err7 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/lockingType', + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } + if ( + !( + data11 === 'p2sh20' || + data11 === 'standard' + ) + ) { + const err8 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/lockingType', + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/enum', + keyword: 'enum', + params: { + allowedValues: + schema38.properties.lockingType + .enum, + }, + message: + 'must be equal to one of the allowed values', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + } + var valid8 = _errs33 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data8.name !== undefined) { + const _errs35 = errors; + if (typeof data8.name !== 'string') { + const err9 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err9]; + } else { + vErrors.push(err9); + } + errors++; + } + var valid8 = _errs35 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data8.script !== undefined) { + const _errs37 = errors; + if ( + typeof data8.script !== 'string' + ) { + const err10 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/script', + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/properties/script/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err10]; + } else { + vErrors.push(err10); + } + errors++; + } + var valid8 = _errs37 === errors; + } else { + var valid8 = true; + } + } + } + } + } + } else { + const err11 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptLocking/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err11]; + } else { + vErrors.push(err11); + } + errors++; + } + } + var _valid0 = _errs29 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs39 = errors; + if ( + !validate38(data8, { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + parentData: data7, + parentDataProperty: key3, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate38.errors + : vErrors.concat(validate38.errors); + errors = vErrors.length; + } + var _valid0 = _errs39 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs40 = errors; + const _errs41 = errors; + if (errors === _errs41) { + if ( + data8 && + typeof data8 == 'object' && + !Array.isArray(data8) + ) { + let missing3; + if ( + (data8.script === undefined && + (missing3 = 'script')) || + (data8.unlocks === undefined && + (missing3 = 'unlocks')) + ) { + const err12 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/required', + keyword: 'required', + params: { missingProperty: missing3 }, + message: + "must have required property '" + + missing3 + + "'", + }; + if (vErrors === null) { + vErrors = [err12]; + } else { + vErrors.push(err12); + } + errors++; + } else { + const _errs43 = errors; + for (const key6 in data8) { + if ( + !func4.call( + schema41.properties, + key6 + ) + ) { + const err13 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/additionalProperties', + keyword: 'additionalProperties', + params: { + additionalProperty: key6, + }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err13]; + } else { + vErrors.push(err13); + } + errors++; + break; + } + } + if (_errs43 === errors) { + if (data8.ageLock !== undefined) { + const _errs44 = errors; + if ( + typeof data8.ageLock !== 'string' + ) { + const err14 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/ageLock', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/ageLock/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err14]; + } else { + vErrors.push(err14); + } + errors++; + } + var valid10 = _errs44 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if (data8.estimate !== undefined) { + const _errs46 = errors; + if ( + typeof data8.estimate !== + 'string' + ) { + const err15 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/estimate', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/estimate/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err15]; + } else { + vErrors.push(err15); + } + errors++; + } + var valid10 = _errs46 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if (data8.fails !== undefined) { + let data16 = data8.fails; + const _errs48 = errors; + if (errors === _errs48) { + if (Array.isArray(data16)) { + var valid11 = true; + const len0 = data16.length; + for ( + let i0 = 0; + i0 < len0; + i0++ + ) { + const _errs50 = errors; + if ( + typeof data16[i0] !== + 'string' + ) { + const err16 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/fails/' + + i0, + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/items/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + var valid11 = + _errs50 === errors; + if (!valid11) { + break; + } + } + } else { + const err17 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace( + /\//g, + '~1' + ) + + '/fails', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + } + var valid10 = + _errs48 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.invalid !== undefined + ) { + let data18 = data8.invalid; + const _errs52 = errors; + if (errors === _errs52) { + if (Array.isArray(data18)) { + var valid12 = true; + const len1 = + data18.length; + for ( + let i1 = 0; + i1 < len1; + i1++ + ) { + const _errs54 = errors; + if ( + typeof data18[i1] !== + 'string' + ) { + const err18 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/invalid/' + + i1, + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/items/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if ( + vErrors === null + ) { + vErrors = [err18]; + } else { + vErrors.push(err18); + } + errors++; + } + var valid12 = + _errs54 === errors; + if (!valid12) { + break; + } + } + } else { + const err19 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace( + /\//g, + '~1' + ) + + '/invalid', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/type', + keyword: 'type', + params: { + type: 'array', + }, + message: + 'must be array', + }; + if (vErrors === null) { + vErrors = [err19]; + } else { + vErrors.push(err19); + } + errors++; + } + } + var valid10 = + _errs52 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.name !== undefined + ) { + const _errs56 = errors; + if ( + typeof data8.name !== + 'string' + ) { + const err20 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace( + /\//g, + '~1' + ) + + '/name', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/name/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if (vErrors === null) { + vErrors = [err20]; + } else { + vErrors.push(err20); + } + errors++; + } + var valid10 = + _errs56 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.passes !== undefined + ) { + let data21 = data8.passes; + const _errs58 = errors; + if (errors === _errs58) { + if ( + Array.isArray(data21) + ) { + var valid13 = true; + const len2 = + data21.length; + for ( + let i2 = 0; + i2 < len2; + i2++ + ) { + const _errs60 = + errors; + if ( + typeof data21[ + i2 + ] !== 'string' + ) { + const err21 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/passes/' + + i2, + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/items/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if ( + vErrors === null + ) { + vErrors = [ + err21, + ]; + } else { + vErrors.push( + err21 + ); + } + errors++; + } + var valid13 = + _errs60 === + errors; + if (!valid13) { + break; + } + } + } else { + const err22 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/passes', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/type', + keyword: 'type', + params: { + type: 'array', + }, + message: + 'must be array', + }; + if ( + vErrors === null + ) { + vErrors = [err22]; + } else { + vErrors.push(err22); + } + errors++; + } + } + var valid10 = + _errs58 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.script !== + undefined + ) { + const _errs62 = errors; + if ( + typeof data8.script !== + 'string' + ) { + const err23 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/script', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/script/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if ( + vErrors === null + ) { + vErrors = [err23]; + } else { + vErrors.push(err23); + } + errors++; + } + var valid10 = + _errs62 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.timeLockType !== + undefined + ) { + let data24 = + data8.timeLockType; + const _errs64 = + errors; + if ( + typeof data24 !== + 'string' + ) { + const err24 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/timeLockType', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if ( + vErrors === null + ) { + vErrors = [err24]; + } else { + vErrors.push( + err24 + ); + } + errors++; + } + if ( + !( + data24 === + 'height' || + data24 === + 'timestamp' + ) + ) { + const err25 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/timeLockType', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/enum', + keyword: 'enum', + params: { + allowedValues: + schema41 + .properties + .timeLockType + .enum, + }, + message: + 'must be equal to one of the allowed values', + }; + if ( + vErrors === null + ) { + vErrors = [err25]; + } else { + vErrors.push( + err25 + ); + } + errors++; + } + var valid10 = + _errs64 === errors; + } else { + var valid10 = true; + } + if (valid10) { + if ( + data8.unlocks !== + undefined + ) { + const _errs66 = + errors; + if ( + typeof data8.unlocks !== + 'string' + ) { + const err26 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace( + /~/g, + '~0' + ) + .replace( + /\//g, + '~1' + ) + + '/unlocks', + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/properties/unlocks/type', + keyword: 'type', + params: { + type: 'string', + }, + message: + 'must be string', + }; + if ( + vErrors === null + ) { + vErrors = [ + err26, + ]; + } else { + vErrors.push( + err26 + ); + } + errors++; + } + var valid10 = + _errs66 === + errors; + } else { + var valid10 = true; + } + } + } + } + } + } + } + } + } + } + } + } else { + const err27 = { + instancePath: + instancePath + + '/scripts/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/AuthenticationTemplateScriptUnlocking/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err27]; + } else { + vErrors.push(err27); + } + errors++; + } + } + var _valid0 = _errs40 === errors; + valid4 = valid4 || _valid0; + } + } + } + if (!valid4) { + const err28 = { + instancePath: + instancePath + + '/scripts/' + + key3.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/properties/scripts/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err28]; + } else { + vErrors.push(err28); + } + errors++; + validate21.errors = vErrors; + return false; + } else { + errors = _errs20; + if (vErrors !== null) { + if (_errs20) { + vErrors.length = _errs20; + } else { + vErrors = null; + } + } + } + var valid3 = _errs19 === errors; + if (!valid3) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/scripts', + schemaPath: '#/properties/scripts/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs16 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.supported !== undefined) { + let data26 = data.supported; + const _errs68 = errors; + if (errors === _errs68) { + if (Array.isArray(data26)) { + var valid14 = true; + const len3 = data26.length; + for (let i3 = 0; i3 < len3; i3++) { + let data27 = data26[i3]; + const _errs70 = errors; + if (typeof data27 !== 'string') { + validate21.errors = [ + { + instancePath: + instancePath + '/supported/' + i3, + schemaPath: + '#/definitions/AuthenticationVirtualMachineIdentifier/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + if ( + !( + data27 === 'BCH_2019_05' || + data27 === 'BCH_2019_11' || + data27 === 'BCH_2020_05' || + data27 === 'BCH_2020_11_SPEC' || + data27 === 'BCH_2020_11' || + data27 === 'BCH_2021_05_SPEC' || + data27 === 'BCH_2021_05' || + data27 === 'BCH_2021_11_SPEC' || + data27 === 'BCH_2021_11' || + data27 === 'BCH_2022_05_SPEC' || + data27 === 'BCH_2022_05' || + data27 === 'BCH_2022_11_SPEC' || + data27 === 'BCH_2022_11' || + data27 === 'BSV_2018_11' || + data27 === 'BSV_2020_02' || + data27 === 'BTC_2017_08' + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + '/supported/' + i3, + schemaPath: + '#/definitions/AuthenticationVirtualMachineIdentifier/enum', + keyword: 'enum', + params: { allowedValues: schema42.enum }, + message: + 'must be equal to one of the allowed values', + }, + ]; + return false; + } + var valid14 = _errs70 === errors; + if (!valid14) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/supported', + schemaPath: '#/properties/supported/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs68 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.version !== undefined) { + let data28 = data.version; + const _errs73 = errors; + if ( + !(typeof data28 == 'number' && isFinite(data28)) + ) { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: '#/properties/version/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + if (0 !== data28) { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: '#/properties/version/const', + keyword: 'const', + params: { allowedValue: 0 }, + message: 'must be equal to constant', + }, + ]; + return false; + } + var valid0 = _errs73 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } else { + validate21.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate21.errors = vErrors; + return errors === 0; +} +function validate20( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {} +) { + let vErrors = null; + let errors = 0; + if ( + !validate21(data, { + instancePath, + parentData, + parentDataProperty, + rootData, + }) + ) { + vErrors = + vErrors === null ? validate21.errors : vErrors.concat(validate21.errors); + errors = vErrors.length; + } + validate20.errors = vErrors; + return errors === 0; +} diff --git a/src/lib/schema/authentication-template.schema.json b/src/lib/schema/authentication-template.schema.json new file mode 100644 index 00000000..51270ddb --- /dev/null +++ b/src/lib/schema/authentication-template.schema.json @@ -0,0 +1,632 @@ +{ + "$ref": "#/definitions/AuthenticationTemplate", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "AuthenticationTemplate": { + "additionalProperties": false, + "description": "An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.", + "properties": { + "$schema": { + "description": "The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.", + "type": "string" + }, + "description": { + "description": "An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", + "type": "string" + }, + "entities": { + "additionalProperties": { + "$ref": "#/definitions/AuthenticationTemplateEntity" + }, + "description": "A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.", + "type": "object" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this authentication template (for use in user interfaces).", + "type": "string" + }, + "scenarios": { + "additionalProperties": { + "$ref": "#/definitions/AuthenticationTemplateScenario" + }, + "description": "A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.", + "type": "object" + }, + "scripts": { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/AuthenticationTemplateScript" + }, + { + "$ref": "#/definitions/AuthenticationTemplateScriptLocking" + }, + { + "$ref": "#/definitions/AuthenticationTemplateScriptTested" + }, + { + "$ref": "#/definitions/AuthenticationTemplateScriptUnlocking" + } + ] + }, + "description": "A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.", + "type": "object" + }, + "supported": { + "description": "A list of authentication virtual machine versions supported by this template.\n\nVirtual machine identifiers use the format `CODE_YYYY_MM`, where `CODE` is the currency code used to identify the network, and `YYYY_MM` is the year and month in which the specified VM version became active on the indicated network.\n\nIdentifiers with the `_SPEC` suffix indicate that this template is intended for compatibility with a future virtual machine version, but at the time the template was create, that virtual machine had not yet become active on the specified chain.\n\nThe earliest possible `_SPEC` virtual machine version is `BCH_2020_11_SPEC`, the first virtual machine version after the public release of the version `0` AuthenticationTemplate format.", + "items": { + "$ref": "#/definitions/AuthenticationVirtualMachineIdentifier" + }, + "type": "array" + }, + "version": { + "const": 0, + "description": "A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.", + "type": "number" + } + }, + "required": ["entities", "scripts", "supported", "version"], + "type": "object" + }, + "AuthenticationTemplateAddressData": { + "additionalProperties": false, + "properties": { + "description": { + "description": "A single-line, human readable description for this address data.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this address data.", + "type": "string" + }, + "type": { + "const": "AddressData", + "description": "`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + "AuthenticationTemplateEntity": { + "additionalProperties": false, + "description": "An object describing the configuration for a particular entity within an authentication template.", + "properties": { + "description": { + "description": "An optionally multi-line, free-form, human-readable description for this entity (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this entity for use in user interfaces and error messages, e.g.: `Trusted Third-Party`.", + "type": "string" + }, + "scripts": { + "description": "An array of the identifiers of each script the entity must be capable of generating, e.g. each of the unlocking scripts this entity might use.\n\nProvided the necessary variables, any entity can construct any script, but this option allows us to hint to more advanced wallets which scripts to recommend to users. (Especially when many scripts require inter-entity communication initiated by a user.)\n\nIf not provided, this property is assumed to include all scripts in the template.", + "items": { + "type": "string" + }, + "type": "array" + }, + "variables": { + "additionalProperties": { + "$ref": "#/definitions/AuthenticationTemplateVariable" + }, + "description": "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", + "type": "object" + } + }, + "type": "object" + }, + "AuthenticationTemplateHdKey": { + "additionalProperties": false, + "properties": { + "addressOffset": { + "description": "The offset by which to increment the `addressIndex` provided in the compilation data when deriving this `HdKey`. (Default: 0)\n\nThis is useful for deriving the \"next\" (`1`) or \"previous\" (`-1`) address to be used in the current compiler configuration.", + "type": "number" + }, + "description": { + "description": "A single-line, human readable description for this HD key.", + "type": "string" + }, + "hdPublicKeyDerivationPath": { + "description": "The path to derive the entity's HD public key from the entity's master HD private key. By default, `m` (i.e. the entity's HD public key represents the same node in the HD tree as its HD private key).\n\nThis can be used to specify another derivation path from which the `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See `publicDerivationPath` for details.\n\nThis path must begin with an `m` (private derivation) and be fixed – it cannot contain an `i` character to represent the address index, as a dynamic hardened path would require a new HD public key for each address.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this HD key.", + "type": "string" + }, + "privateDerivationPath": { + "description": "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", + "type": "string" + }, + "publicDerivationPath": { + "description": "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", + "type": "string" + }, + "type": { + "const": "HdKey", + "description": "The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + "AuthenticationTemplateKey": { + "additionalProperties": false, + "properties": { + "description": { + "description": "A single-line, human readable description for this key.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this key.", + "type": "string" + }, + "type": { + "const": "Key", + "description": "The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + "AuthenticationTemplateScenario": { + "additionalProperties": false, + "description": "An object describing the configuration for a particular scenario within an authentication template.", + "properties": { + "data": { + "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "description": "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object." + }, + "description": { + "description": "An optionally multi-line, free-form, human-readable description for this scenario (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", + "type": "string" + }, + "extends": { + "description": "The identifier of the scenario that this scenario extends. Any `data` or `transaction` properties not defined in this scenario inherit from the extended parent scenario.\n\nIf undefined, this scenario is assumed to extend the default scenario:\n\n- The default values for `data` are set: - The identifiers of all `Key` variables and entities in this template are lexicographically sorted, then each is assigned an incrementing positive integer – beginning with `1` – encoded as an unsigned, 256-bit, big-endian integer (i.e. `0x0000...0001` (32 bytes), `0x0000...0002`, `0x0000...0003`, etc.). For `Key`s, this assigned value is used as the private key; For entities, the assigned value is used as the master seed of that entity's `HdPrivateKey`. If `hdKey` is set, the `addressIndex` is set to `0`. - `currentBlockHeight` is set to `2`. This is the height of the second mined block after the genesis block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. This default value was chosen to be low enough to simplify the debugging of block height offsets while remaining differentiated from `0` and `1`, which are used both as boolean return values and for control flow. - `currentBlockTime` is set to `1231469665`. This is the Median Time-Past block time (BIP113) of block `2`.\n\n- Then `transaction` is set based on use: - if the scenario is being used for transaction estimation, all transaction properties are taken from the transaction being estimated. - if the scenario is being used for script testing and validation, the default value for each `transaction` property is used.\n\nWhen a scenario is extended, each property of `data` and `transaction` is extended individually: if the extending scenario does not provide a new value for `data.bytecode.value` or `transaction.property`, the parent value is used. To avoid inheriting a parent value, each child value must be individually overridden.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this scenario for use in user interfaces, e.g.: `Delayed Recovery`.", + "type": "string" + }, + "sourceOutputs": { + "description": "The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `[\"slot\"]` – the output at the same index as the `[\"slot\"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": [\"slot\"] }]`.", + "items": { + "$ref": "#/definitions/AuthenticationTemplateScenarioSourceOutput" + }, + "type": "array" + }, + "transaction": { + "additionalProperties": false, + "description": "The transaction within which this scenario should be evaluated. This is used for script testing and validation.\n\nIf undefined, inherits the default value for each property: ```json { \"inputs\": [{ \"unlockingBytecode\": ['slot'] }], \"locktime\": 0, \"outputs\": [{ \"lockingBytecode\": {} }], \"version\": 2 } ```\n\nAny `transaction` property that is not set will be inherited from the scenario specified by `extends`. when specifying the `inputs` and `outputs` properties, each input and output extends the default values for inputs and outputs, respectively.\n\nFor example, an input of `{}` is interpreted as: ```json { \"outpointIndex\": 0, \"outpointTransactionHash\": \"0000000000000000000000000000000000000000000000000000000000000000\", \"sequenceNumber\": 0, \"unlockingBytecode\": ['slot'] } ``` And an output of `{}` is interpreted as: ```json { \"lockingBytecode\": { \"script\": ['copy'], \"overrides\": { \"hdKeys\": { \"addressIndex\": 1 } } }, \"valueSatoshis\": 0 } ```", + "properties": { + "inputs": { + "description": "The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `[\"slot\"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ \"unlockingBytecode\": [\"slot\"] }]`.", + "items": { + "$ref": "#/definitions/AuthenticationTemplateScenarioInput" + }, + "type": "array" + }, + "locktime": { + "description": "The locktime to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, defaults to `0`.\n\nLocktime can be provided as either a timestamp or a block height. Values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`). Values greater than or equal to `500000000` are understood to be a UNIX timestamp.\n\nFor validating timestamp values, the median timestamp of the last 11 blocks (Median Time-Past) is used. The precise behavior is defined in BIP113.\n\nIf the `sequenceNumber` of every transaction input is set to `0xffffffff` (`4294967295`), locktime is disabled, and the transaction may be added to a block even if the specified locktime has not yet been reached. When locktime is disabled, if an `OP_CHECKLOCKTIMEVERIFY` operation is encountered during the verification of any input, an error is produced, and the transaction is invalid.", + "type": "number" + }, + "outputs": { + "description": "The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": {} }]`.", + "items": { + "$ref": "#/definitions/AuthenticationTemplateScenarioTransactionOutput" + }, + "type": "array" + }, + "version": { + "description": "The version to use when generating the transaction for this scenario. A positive integer from `0` to a maximum of `4294967295` – if undefined, inherits the default scenario `version` value: `2`.", + "type": "number" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "AuthenticationTemplateScenarioBytecode": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "overrides": { + "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "description": "Scenario data that extends the scenario's top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ \"hdKeys\": { \"addressIndex\": 1 } }` for `transaction.outputs`." + }, + "script": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "const": "copy", + "type": "string" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + } + ], + "description": "The identifier of the script to compile when generating this bytecode. May also be set to `[\"copy\"]`, which is automatically replaced with the identifier of the locking or unlocking script under test, respectively.\n\nIf undefined, defaults to `[\"copy\"]`." + } + }, + "type": "object" + } + ], + "description": "A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: [\"copy\"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: [\"copy\"], overrides: { \"hdKeys\": { \"addressIndex\": 1 } } }`." + }, + "AuthenticationTemplateScenarioData": { + "additionalProperties": false, + "description": "An object defining the data to use while compiling a scenario.", + "properties": { + "bytecode": { + "additionalProperties": { + "type": "string" + }, + "description": "A map of full identifiers to CashAssembly scripts that compile to each identifier's value for this scenario. Allowing `bytecode` to be specified as scripts (rather than e.g. hex) offers greater power and flexibility.\n\nBytecode scripts have access to each other and all other template scripts and defined variables, however, cyclical references will produce an error at compile time. Also, because the results of these compilations will be used to generate the compilation context for this scenario, these scripts may not use compiler operations that themselves require access to compilation context (e.g. signatures).\n\nThe provided `fullIdentifier` should match the complete identifier for each item, e.g. `some_wallet_data`, `variable_id.public_key`, or `variable_id.signature.all_outputs`.\n\nAll `AddressData` and `WalletData` variables must be provided via `bytecode` (though the default scenario automatically includes reasonable values), and pre-computed results for operations of other variable types (e.g. `key.public_key`) may also be provided via this property.\n\nBecause each bytecode identifier may precisely match the identifier of the variable it defines for this scenario, references between these scripts must refer to the target script with a `_scenario.` prefix. E.g. to reference a sibling script `my_foo` from `my_bar`, the `my_bar` script must use the identifier `_scenario.my_foo`.", + "type": "object" + }, + "currentBlockHeight": { + "description": "The current block height at the \"address creation time\" implied in this scenario.", + "type": "number" + }, + "currentBlockTime": { + "description": "The current MTP block time as a UNIX timestamp at the \"address creation time\" implied in this scenario.\n\nNote, this is never a current timestamp, but rather the median timestamp of the last 11 blocks. It is therefore approximately one hour in the past.\n\nEvery block has a precise MTP block time, much like a block height. See BIP113 for details.", + "type": "number" + }, + "hdKeys": { + "additionalProperties": false, + "description": "An object describing the settings used for `HdKey` variables in this scenario.", + "properties": { + "addressIndex": { + "description": "The current address index to be used for this scenario. The `addressIndex` gets added to each `HdKey`s `addressOffset` to calculate the dynamic index (`i`) used in each `privateDerivationPath` or `publicDerivationPath`.\n\nThis is required for any compiler operation that requires derivation. Typically, the value is incremented by one for each address in a wallet.\n\nDefaults to `0`.", + "type": "number" + }, + "hdPrivateKeys": { + "additionalProperties": { + "type": "string" + }, + "description": "A map of entity IDs to master HD private keys. These master HD private keys are used to derive each `HdKey` variable assigned to that entity according to its `privateDerivationPath`.\n\nHD private keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.", + "type": "object" + }, + "hdPublicKeys": { + "additionalProperties": { + "type": "string" + }, + "description": "A map of entity IDs to HD public keys. These HD public keys are used to derive public keys for each `HdKey` variable assigned to that entity according to its `publicDerivationPath`.\n\nHD public keys may be encoded for either mainnet or testnet (the network information is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in `hdPublicKeys`) are provided for the same entity in the same scenario (not recommended), the HD private key is used.", + "type": "object" + } + }, + "type": "object" + }, + "keys": { + "additionalProperties": false, + "description": "An object describing the settings used for `Key` variables in this scenario.", + "properties": { + "privateKeys": { + "additionalProperties": { + "type": "string" + }, + "description": "A map of `Key` variable IDs to their 32-byte, hexadecimal-encoded private key values.", + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "AuthenticationTemplateScenarioInput": { + "additionalProperties": false, + "description": "An example input used to define a scenario for an authentication template.", + "properties": { + "outpointIndex": { + "description": "The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to the same index as the input itself (so that by default, every outpoint in the produced transaction is different, even if an empty `outpointTransactionHash` is used for each transaction).", + "type": "number" + }, + "outpointTransactionHash": { + "description": "A 32-byte, hexadecimal-encoded hash of the transaction from which this input is spent in big-endian byte order. This is the byte order typically seen in block explorers and user interfaces (as opposed to little-endian byte order, which is used in standard P2P network messages).\n\nIf undefined, this defaults to the \"empty\" hash: `0000000000000000000000000000000000000000000000000000000000000000`\n\nA.K.A. Outpoint `Transaction ID`", + "type": "string" + }, + "sequenceNumber": { + "description": "The positive, 32-bit unsigned integer used as the \"sequence number\" for this input.\n\nIf undefined, this defaults to `0`.", + "type": "number" + }, + "unlockingBytecode": { + "anyOf": [ + { + "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + }, + { + "items": { + "const": "slot", + "type": "string" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + } + ], + "description": "The `unlockingBytecode` value of this input for this scenario. This must be either `[\"slot\"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `[\"slot\"]` for exactly one input in the scenario.\n\nDefaults to `[\"slot\"]`." + } + }, + "type": "object" + }, + "AuthenticationTemplateScenarioOutput": { + "additionalProperties": false, + "description": "An example output used to define a scenario for an authentication template.", + "properties": { + "lockingBytecode": { + "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode", + "description": "The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `[\"slot\"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario's `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)" + }, + "valueSatoshis": { + "description": "The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `\"ffffffffffffffff\"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.", + "type": ["number", "string"] + } + }, + "type": "object" + }, + "AuthenticationTemplateScenarioOutput": { + "additionalProperties": false, + "description": "An example output used to define a scenario for an authentication template.", + "properties": { + "lockingBytecode": { + "anyOf": [ + { + "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + }, + { + "items": { + "const": "slot", + "type": "string" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + } + ], + "description": "The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `[\"slot\"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario's `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)" + }, + "valueSatoshis": { + "description": "The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum number of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of `Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value is defined using a `number`. However, this value may also be defined using a 16-character, hexadecimal-encoded `string`, to allow for the full range of the 64-bit unsigned, little-endian integer used to encode `valueSatoshis` in the encoded output format, e.g. `\"ffffffffffffffff\"`. This is useful for representing scenarios where intentionally excessive values are provided (to ensure an otherwise properly-signed transaction can never be included in the blockchain), e.g. transaction size estimations or off-chain Bitauth signatures.\n\nIf undefined, this defaults to: `0`.", + "type": ["number", "string"] + } + }, + "type": "object" + }, + "AuthenticationTemplateScenarioSourceOutput": { + "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", + "description": "A source output used by an authentication template scenario." + }, + "AuthenticationTemplateScenarioTransactionOutput": { + "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", + "description": "A transaction output used to define an authentication template scenario transaction." + }, + "AuthenticationTemplateScript": { + "additionalProperties": false, + "description": "An object describing the configuration for a particular script within an authentication template.", + "properties": { + "name": { + "description": "A single-line, human-readable name for this script (for use in user interfaces).", + "type": "string" + }, + "script": { + "description": "The script definition in CashAssembly.", + "type": "string" + } + }, + "required": ["script"], + "type": "object" + }, + "AuthenticationTemplateScriptLocking": { + "additionalProperties": false, + "properties": { + "lockingType": { + "description": "Indicates if P2SH20 infrastructure should be used when producing bytecode related to this script. For more information on P2SH20, see BIP16.\n\nWhen compiling locking scripts of type `p2sh20`, the result will be placed in a P2SH20 \"redeem script\" format: `OP_HASH160 <$( OP_HASH160)> OP_EQUAL`\n\nWhen compiling unlocking scripts that unlock locking scripts of type `p2sh20`, the result will be transformed into the P2SH20 unlocking format: `unlockingBytecode ` (where `lockingBytecode` is the compiled bytecode of the locking script, without the \"redeem script\" transformation.)\n\nThe presence of the `lockingType` property indicates that this script is a locking script. It must be present on any script referenced by the `unlocks` property of another script.", + "enum": ["p2sh20", "standard"], + "type": "string" + }, + "name": { + "description": "A single-line, human-readable name for this script (for use in user interfaces).", + "type": "string" + }, + "script": { + "description": "The script definition in CashAssembly.", + "type": "string" + } + }, + "required": ["lockingType", "script"], + "type": "object" + }, + "AuthenticationTemplateScriptTest": { + "additionalProperties": false, + "properties": { + "check": { + "description": "The script to evaluate after the script being tested. This can be used to check that the tested script leaves the expected results on the stack. For example, if the tested script is expected to leave 3 items of a specific size on the stack, the `check` script could pop each resulting item from the stack and examine it for correctness.\n\nIn scenario testing, this script is appended to the script under test, and together they are treated as the locking script. Program evaluation is considered successful if the resulting program state can be verified by the virtual machine (e.g. the resulting stack contains a single `1`, no errors are produced, etc.).", + "type": "string" + }, + "fails": { + "description": "A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that fails program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "invalid": { + "description": "A list of the scenario identifiers that – when used to compile this test and the script it tests – result in a compilation error. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this test (for use in user interfaces).", + "type": "string" + }, + "passes": { + "description": "A list of the scenario identifiers that – when used to compile this test and the script it tests – result in bytecode that passes program verification. The `setup` script is used in place of an unlocking script, and the concatenation of the script under test and the `check` script are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "setup": { + "description": "A script to evaluate before the script being tested. This can be used to push values to the stack that are operated on by the tested script.\n\nIn scenario testing, this script is treated as the unlocking script.", + "type": "string" + } + }, + "required": ["check"], + "type": "object" + }, + "AuthenticationTemplateScriptTested": { + "additionalProperties": false, + "properties": { + "name": { + "description": "A single-line, human-readable name for this script (for use in user interfaces).", + "type": "string" + }, + "pushed": { + "description": "If set to `true`, indicates that this script should be wrapped in a push statement for testing.\n\nThis is useful for scripts that serve as \"bytecode templates\" – e.g. formatted messages or signature preimages. These scripts are typically not evaluated as bytecode but appear within push statements elsewhere in the template.\n\nDefaults to `false`.", + "type": "boolean" + }, + "script": { + "description": "The script definition in CashAssembly.", + "type": "string" + }, + "tests": { + "additionalProperties": { + "$ref": "#/definitions/AuthenticationTemplateScriptTest" + }, + "description": "One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.", + "type": "object" + } + }, + "required": ["script", "tests"], + "type": "object" + }, + "AuthenticationTemplateScriptUnlocking": { + "additionalProperties": false, + "properties": { + "ageLock": { + "description": "TODO: not yet implemented\n\nThe minimum input age required for this unlocking script to become valid.\n\nThis value is provided as a CashAssembly script that must compile to the least significant 3 bytes of the minimum sequence number required for this unlocking script to be valid (the \"type bit\" and the 2-byte \"value\" – see BIP68 for details). This script has access to all other template scripts and variables, but cyclical references will produce an error at compile time.\n\nIn supporting wallets, this value can be computed at address creation time, and the remaining time for which any UTXO remains \"age-locked\" can be displayed in user interfaces (by parsing the \"type bit\" and \"value\" as described in BIP68).\n\nNote, because the precise value used by `OP_CHECKSEQUENCEVERIFY` can be provided in the unlocking script, it is trivial to create an unlocking script for which a proper value for `ageLock` is not possible to determine until the spending transaction is prepared. These cases are intentionally out-of-scope for this property. Instead, `ageLock` should only be used for unlocking scripts where the expected value can be compiled at address creation time.", + "type": "string" + }, + "estimate": { + "description": "The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute an \"estimated transaction\", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction's change output(s). Because estimate scenarios provide \"estimated\" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.", + "type": "string" + }, + "fails": { + "description": "A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that fails program verification.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "invalid": { + "description": "A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in a compilation error.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "A single-line, human-readable name for this script (for use in user interfaces).", + "type": "string" + }, + "passes": { + "description": "A list of the scenario identifiers that – when used to compile this unlocking script and the script it unlocks – result in bytecode that passes program verification.\n\nThese scenarios can be used to test this script in development and review.", + "items": { + "type": "string" + }, + "type": "array" + }, + "script": { + "description": "The script definition in CashAssembly.", + "type": "string" + }, + "timeLockType": { + "description": "The expected type of time locks in this script.\n\nBecause `OP_CHECKLOCKTIMEVERIFY` reads from a transaction's `locktime` property, every input to a given transaction must share the same time lock type. This differs from `OP_CHECKSEQUENCEVERIFY` in that each input has its own `sequenceNumber`, so compatibility is not required.\n\nIf a transaction includes multiple inputs using scripts with `timeLockType` defined, and the types are not compatible, generation should fail.\n\nThe `timestamp` type indicates that the transaction's locktime is provided as a UNIX timestamp (the `locktime` value is greater than or equal to `500000000`).\n\nThe `height` type indicates that the transaction's locktime is provided as a block height (the `locktime` value is less than `500000000`).\n\nIf `timeLockType` is undefined, the script is assumed to have no reliance on absolute time locks.", + "enum": ["height", "timestamp"], + "type": "string" + }, + "unlocks": { + "description": "The identifier of the script that can be unlocked by this script.\n\nThe presence of the `unlocks` property indicates that this script is an unlocking script, and the script it unlocks must be a locking script.", + "type": "string" + } + }, + "required": ["script", "unlocks"], + "type": "object" + }, + "AuthenticationTemplateVariable": { + "anyOf": [ + { + "$ref": "#/definitions/AuthenticationTemplateAddressData" + }, + { + "$ref": "#/definitions/AuthenticationTemplateHdKey" + }, + { + "$ref": "#/definitions/AuthenticationTemplateKey" + }, + { + "$ref": "#/definitions/AuthenticationTemplateWalletData" + } + ] + }, + "AuthenticationTemplateWalletData": { + "additionalProperties": false, + "properties": { + "description": { + "description": "A single-line, human readable description for this wallet data.", + "type": "string" + }, + "name": { + "description": "A single-line, Title Case, human-readable name for this wallet data.", + "type": "string" + }, + "type": { + "const": "WalletData", + "description": "The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + "AuthenticationVirtualMachineIdentifier": { + "description": "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin (Core) network.\n\nVirtual machine versions may be marked with the `SPEC` suffix to indicate that they have not yet been deployed to a main network and are therefore only a draft specification. After deployment, when template compatibility is verified, templates should update their `supported` array to indicate compatibility with the live virtual machine version.", + "enum": [ + "BCH_2019_05", + "BCH_2019_11", + "BCH_2020_05", + "BCH_2020_11_SPEC", + "BCH_2020_11", + "BCH_2021_05_SPEC", + "BCH_2021_05", + "BCH_2021_11_SPEC", + "BCH_2021_11", + "BCH_2022_05_SPEC", + "BCH_2022_05", + "BCH_2022_11_SPEC", + "BCH_2022_11", + "BSV_2018_11", + "BSV_2020_02", + "BTC_2017_08" + ], + "type": "string" + } + } +} diff --git a/src/lib/template/template-validation.spec.ts b/src/lib/schema/authentication-template.spec.ts similarity index 91% rename from src/lib/template/template-validation.spec.ts rename to src/lib/schema/authentication-template.spec.ts index 2f12e0d2..fef51713 100644 --- a/src/lib/template/template-validation.spec.ts +++ b/src/lib/schema/authentication-template.spec.ts @@ -1,53 +1,63 @@ -/* eslint-disable max-lines, functional/no-expression-statement */ -import test, { Macro } from 'ava'; +/* eslint-disable max-lines */ +import test from 'ava'; +import type { AuthenticationTemplate } from '../lib'; import { BuiltInVariables, + importAuthenticationTemplate, stringify, - validateAuthenticationTemplate, -} from '../lib'; +} from '../lib.js'; -const testValidation: Macro<[ - unknown, - ReturnType -]> = (t, input, expected) => { - const result = validateAuthenticationTemplate(input); - t.deepEqual(result, expected, stringify(result)); -}; +test('importAuthenticationTemplate: accepts templates as either JSON strings or pre-parsed objects', (t) => { + const template: AuthenticationTemplate = { + entities: {}, + scripts: { a: { script: '' } }, + supported: ['BCH_2022_05'], + version: 0, + }; + t.deepEqual(template, importAuthenticationTemplate(template)); + t.deepEqual(template, importAuthenticationTemplate(JSON.stringify(template))); +}); -// eslint-disable-next-line functional/immutable-data -testValidation.title = (title) => - `validateAuthenticationTemplate: ${title ?? '?'}`; +const testValidation = test.macro< + [unknown, ReturnType] +>({ + exec: (t, input, expected) => { + const result = importAuthenticationTemplate(input); + t.deepEqual(result, expected, stringify(result)); + }, + title: (title) => `importAuthenticationTemplate: ${title ?? '?'}`, +}); -test( +test.failing( 'must be an object', testValidation, 'a string', 'A valid authentication template must be an object.' ); -test( +test.failing( 'must be version 0', testValidation, { version: 1 }, 'Only version 0 authentication templates are currently supported.' ); -test( +test.failing( 'must provide a "supported" property', testValidation, { supported: 42, version: 0 }, 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_2022_11_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' ); -test( +test.failing( 'must use only known virtual machine identifiers in "supported"', testValidation, { supported: ['not supported'], version: 0 }, 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_2022_11_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' ); -test( +test.failing( 'may not have empty items in "supported"', testValidation, // eslint-disable-next-line no-sparse-arrays @@ -55,42 +65,42 @@ test( 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_2022_11_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' ); -test( +test.failing( '"$schema" must be a string (if present)', testValidation, { $schema: 42, supported: ['BCH_2022_11_SPEC'], version: 0 }, 'The "$schema" property of an authentication template must be a string.' ); -test( +test.failing( '"name" must be a string (if present)', testValidation, { name: 42, supported: ['BCH_2022_11_SPEC'], version: 0 }, 'The "name" property of an authentication template must be a string.' ); -test( +test.failing( '"description" must be a string (if present)', testValidation, { description: 42, supported: ['BCH_2022_11_SPEC'], version: 0 }, 'The "description" property of an authentication template must be a string.' ); -test( +test.failing( '"entities" must be a an object', testValidation, { entities: 42, scripts: {}, supported: ['BCH_2022_11_SPEC'], version: 0 }, 'The "entities" property of an authentication template must be an object.' ); -test( +test.failing( '"scripts" must be a an object', testValidation, { entities: {}, scripts: 42, supported: ['BCH_2022_11_SPEC'], version: 0 }, 'The "scripts" property of an authentication template must be an object.' ); -test( +test.failing( '"scenarios" must be a an object (if present)', testValidation, { @@ -103,7 +113,7 @@ test( 'If defined, the "scenarios" property of an authentication template must be an object.' ); -test( +test.failing( 'script shapes are checked', testValidation, { @@ -116,7 +126,7 @@ test( 'All authentication template scripts must be objects, but the following scripts are not objects: "a".' ); -test( +test.failing( 'empty script object', testValidation, { @@ -129,7 +139,7 @@ test( 'The "script" property of script "a" must be a string.' ); -test( +test.failing( 'unlocking script, no content', testValidation, { @@ -142,7 +152,7 @@ test( 'The "script" property of unlocking script "a" must be a string.' ); -test( +test.failing( 'unlocking script, invalid unlocks', testValidation, { @@ -155,7 +165,7 @@ test( 'The "unlocks" property of unlocking script "a" must be a string.' ); -test( +test.failing( 'unknown locking script', testValidation, { @@ -168,7 +178,7 @@ test( 'The following locking scripts (referenced in "unlocks" properties) were not provided: "b".' ); -test( +test.failing( 'unlocking script, invalid timeLockType', testValidation, { @@ -176,7 +186,7 @@ test( scenarios: {}, scripts: { a: { script: '', timeLockType: 'democracy', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -184,7 +194,7 @@ test( 'If defined, the "timeLockType" property of unlocking script "a" must be either "timestamp" or "height".' ); -test( +test.failing( 'unlocking script, invalid name', testValidation, { @@ -192,7 +202,7 @@ test( scenarios: {}, scripts: { a: { name: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -200,7 +210,7 @@ test( 'If defined, the "name" property of unlocking script "a" must be a string.' ); -test( +test.failing( 'unlocking script, invalid ageLock', testValidation, { @@ -208,7 +218,7 @@ test( scenarios: {}, scripts: { a: { ageLock: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -216,7 +226,7 @@ test( 'If defined, the "ageLock" property of unlocking script "a" must be a string.' ); -test( +test.failing( 'unlocking script, invalid estimate', testValidation, { @@ -224,7 +234,7 @@ test( scenarios: {}, scripts: { a: { estimate: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -232,7 +242,7 @@ test( 'If defined, the "estimate" property of unlocking script "a" must be a string.' ); -test( +test.failing( 'unlocking script, invalid passes', testValidation, { @@ -240,7 +250,7 @@ test( scenarios: {}, scripts: { a: { passes: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -248,7 +258,7 @@ test( 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'unlocking script, invalid fails', testValidation, { @@ -256,7 +266,7 @@ test( scenarios: {}, scripts: { a: { fails: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -264,7 +274,7 @@ test( 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'unlocking script, invalid "invalid"', testValidation, { @@ -272,7 +282,7 @@ test( scenarios: {}, scripts: { a: { invalid: 42, script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -280,7 +290,7 @@ test( 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'unlocking script, empty passes item', testValidation, { @@ -289,7 +299,7 @@ test( scripts: { // eslint-disable-next-line no-sparse-arrays a: { passes: ['s1', , 's2'], script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -297,7 +307,7 @@ test( 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'unlocking script, non-string fails item', testValidation, { @@ -305,7 +315,7 @@ test( scenarios: {}, scripts: { a: { fails: [0], script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -313,7 +323,7 @@ test( 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'unlocking script, non-string invalid item', testValidation, { @@ -321,7 +331,7 @@ test( scenarios: {}, scripts: { a: { invalid: [0], script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh' }, + b: { lockingType: 'p2sh20' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -337,7 +347,7 @@ test( scenarios: {}, scripts: { a: { ageLock: '0xffffff', script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh', script: '' }, + b: { lockingType: 'p2sh20', script: '' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -347,14 +357,14 @@ test( scenarios: {}, scripts: { a: { ageLock: '0xffffff', script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh', script: '' }, + b: { lockingType: 'p2sh20', script: '' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, } ); -test( +test.failing( 'locking script, no type', testValidation, { @@ -364,23 +374,23 @@ test( supported: ['BCH_2022_11_SPEC'], version: 0, }, - 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh".' + 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh20".' ); -test( +test.failing( 'locking script, no contents', testValidation, { entities: {}, scenarios: {}, - scripts: { a: { script: '', unlocks: 'b' }, b: { lockingType: 'p2sh' } }, + scripts: { a: { script: '', unlocks: 'b' }, b: { lockingType: 'p2sh20' } }, supported: ['BCH_2022_11_SPEC'], version: 0, }, 'The "script" property of locking script "b" must be a string.' ); -test( +test.failing( 'locking script, invalid name', testValidation, { @@ -388,7 +398,7 @@ test( scenarios: {}, scripts: { a: { script: '', unlocks: 'b' }, - b: { lockingType: 'p2sh', name: 42, script: '' }, + b: { lockingType: 'p2sh20', name: 42, script: '' }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -396,7 +406,7 @@ test( 'If defined, the "name" property of locking script "b" must be a string.' ); -test( +test.failing( 'tested script, no contents', testValidation, { @@ -411,7 +421,7 @@ test( 'The "script" property of tested script "a" must be a string.' ); -test( +test.failing( 'tested script, invalid name', testValidation, { @@ -426,7 +436,7 @@ test( 'If defined, the "name" property of tested script "a" must be a string.' ); -test( +test.failing( 'tested script, invalid tests', testValidation, { @@ -441,7 +451,7 @@ test( 'If defined, the "tests" property of tested script "a" must be an array.' ); -test( +test.failing( 'tested script, test with no check', testValidation, { @@ -456,7 +466,7 @@ test( 'The "check" properties of all tests in tested script "a" must be a strings.' ); -test( +test.failing( 'tested script, invalid test name', testValidation, { @@ -471,7 +481,7 @@ test( 'If defined, the "name" properties of all tests in tested script "a" must be strings.' ); -test( +test.failing( 'tested script, invalid test setup', testValidation, { @@ -486,7 +496,7 @@ test( 'If defined, the "setup" properties of all tests in tested script "a" must be strings.' ); -test( +test.failing( 'tested script, invalid passes', testValidation, { @@ -501,7 +511,7 @@ test( 'If defined, the "passes" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'tested script, invalid fails', testValidation, { @@ -516,7 +526,7 @@ test( 'If defined, the "fails" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'tested script, invalid "invalid"', testValidation, { @@ -531,7 +541,7 @@ test( 'If defined, the "invalid" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' ); -test( +test.failing( 'tested script, invalid pushed', testValidation, { @@ -556,17 +566,20 @@ test( a: { pushed: true, script: '', - tests: [{ check: '' }, { check: '', name: '', setup: '' }], + tests: { + a: { check: '' }, + b: { check: '', name: '', setup: '' }, + }, }, b: { name: '', pushed: false, script: '', - tests: [ - { check: '', fails: ['s1'] }, - { check: '', passes: ['s2'] }, - { check: '', invalid: ['s3'] }, - ], + tests: { + a: { check: '', fails: ['s1'] }, + b: { check: '', passes: ['s2'] }, + c: { check: '', invalid: ['s3'] }, + }, }, }, supported: ['BCH_2022_11_SPEC'], @@ -579,17 +592,20 @@ test( a: { pushed: true, script: '', - tests: [{ check: '' }, { check: '', name: '', setup: '' }], + tests: { + a: { check: '' }, + b: { check: '', name: '', setup: '' }, + }, }, b: { name: '', pushed: false, script: '', - tests: [ - { check: '', fails: ['s1'] }, - { check: '', passes: ['s2'] }, - { check: '', invalid: ['s3'] }, - ], + tests: { + a: { check: '', fails: ['s1'] }, + b: { check: '', passes: ['s2'] }, + c: { check: '', invalid: ['s3'] }, + }, }, }, supported: ['BCH_2022_11_SPEC'], @@ -597,7 +613,7 @@ test( } ); -test( +test.failing( "tested script, can't test a locking script", testValidation, { @@ -605,7 +621,7 @@ test( scenarios: {}, scripts: { a: { script: '', tests: [], unlocks: 'b' }, - b: { lockingType: 'p2sh', script: '', tests: [] }, + b: { lockingType: 'p2sh20', script: '', tests: [] }, }, supported: ['BCH_2022_11_SPEC'], version: 0, @@ -613,7 +629,7 @@ test( 'Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: "a", "b"' ); -test( +test.failing( 'other script, invalid name', testValidation, { @@ -626,7 +642,7 @@ test( 'If defined, the "name" property of script "a" must be a string.' ); -test( +test.failing( 'invalid entity', testValidation, { @@ -639,7 +655,7 @@ test( 'All authentication template entities must be objects, but the following entities are not objects: "e".' ); -test( +test.failing( 'invalid entity description', testValidation, { @@ -652,7 +668,7 @@ test( 'If defined, the "description" property of entity "e" must be a string.' ); -test( +test.failing( 'invalid entity name', testValidation, { @@ -665,7 +681,7 @@ test( 'If defined, the "name" property of entity "e" must be a string.' ); -test( +test.failing( 'invalid entity scripts', testValidation, { @@ -678,7 +694,7 @@ test( 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' ); -test( +test.failing( 'invalid entity scripts items', testValidation, { @@ -692,7 +708,7 @@ test( 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' ); -test( +test.failing( 'invalid entity variables', testValidation, { @@ -705,7 +721,7 @@ test( 'If defined, the "variables" property of entity "e" must be an object.' ); -test( +test.failing( 'variable, wrong type', testValidation, { @@ -718,7 +734,7 @@ test( 'All authentication template variables must be objects, but the following variables owned by entity "e" are not objects: "v".' ); -test( +test.failing( 'variable, no type', testValidation, { @@ -731,7 +747,7 @@ test( 'The "type" property of variable "v" must be a valid authentication template variable type. Available types are: "AddressData", "HdKey", "Key", "WalletData".' ); -test( +test.failing( 'variable, invalid description', testValidation, { @@ -746,7 +762,7 @@ test( 'If defined, the "description" property of variable "v" must be a string.' ); -test( +test.failing( 'variable, invalid name', testValidation, { @@ -761,7 +777,7 @@ test( 'If defined, the "name" property of variable "v" must be a string.' ); -test( +test.failing( 'HdKey variable, invalid addressOffset', testValidation, { @@ -776,7 +792,7 @@ test( 'If defined, the "addressOffset" property of HdKey "v" must be a number.' ); -test( +test.failing( 'HdKey variable, invalid hdPublicKeyDerivationPath', testValidation, { @@ -791,7 +807,7 @@ test( 'If defined, the "hdPublicKeyDerivationPath" property of HdKey "v" must be a string.' ); -test( +test.failing( 'HdKey variable, invalid privateDerivationPath', testValidation, { @@ -806,7 +822,7 @@ test( 'If defined, the "privateDerivationPath" property of HdKey "v" must be a string.' ); -test( +test.failing( 'HdKey variable, invalid publicDerivationPath', testValidation, { @@ -821,7 +837,7 @@ test( 'If defined, the "publicDerivationPath" property of HdKey "v" must be a string.' ); -test( +test.failing( 'HdKey variable, invalid privateDerivationPath content', testValidation, { @@ -836,7 +852,7 @@ test( 'If defined, the "privateDerivationPath" property of HdKey "v" must be a valid private derivation path, but the provided value is "m". A valid path must begin with "m" and include only "/", "\'", a single "i" address index character, and numbers.' ); -test( +test.failing( 'HdKey variable, invalid hdPublicKeyDerivationPath content', testValidation, { @@ -853,7 +869,7 @@ test( 'If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey\'s HD public node, but the provided value for HdKey "v" is "M/0". A valid path must begin with "m" and include only "/", "\'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").' ); -test( +test.failing( 'HdKey variable, invalid publicDerivationPath content', testValidation, { @@ -870,7 +886,7 @@ test( 'The "publicDerivationPath" property of HdKey "v" must be a valid public derivation path, but the current value is "m/0". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".' ); -test( +test.failing( 'HdKey variable, invalid implied private derivation path', testValidation, { @@ -957,7 +973,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid type', testValidation, { @@ -970,7 +986,7 @@ test( 'All authentication template scenarios must be objects, but the following scenarios are not objects: "a".' ); -test( +test.failing( 'Scenario, invalid name', testValidation, { @@ -983,7 +999,7 @@ test( 'If defined, the "name" property of scenario "a" must be a string.' ); -test( +test.failing( 'Scenario, invalid description', testValidation, { @@ -996,7 +1012,7 @@ test( 'If defined, the "description" property of scenario "a" must be a string.' ); -test( +test.failing( 'Scenario, invalid extends', testValidation, { @@ -1009,7 +1025,7 @@ test( 'If defined, the "extends" property of scenario "a" must be a string.' ); -test( +test.failing( 'Scenario, unknown extends', testValidation, { @@ -1022,7 +1038,7 @@ test( 'If defined, each scenario ID referenced by another scenario\'s "extends" property must exist. Unknown scenario IDs: "c", "d".' ); -test( +test.failing( 'Scenario, invalid value (negative)', testValidation, { @@ -1035,7 +1051,7 @@ test( 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' ); -test( +test.failing( 'Scenario, invalid value (greater than Number.MAX_SAFE_INTEGER)', testValidation, { @@ -1048,7 +1064,7 @@ test( 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' ); -test( +test.failing( 'Scenario, invalid value (insufficient hex)', testValidation, { @@ -1066,21 +1082,25 @@ test( testValidation, { entities: {}, - scenarios: { a: { value: 'ffffffffffffffff' } }, + scenarios: { + a: { sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }] }, + }, scripts: {}, supported: ['BCH_2022_11_SPEC'], version: 0, }, { entities: {}, - scenarios: { a: { value: 'ffffffffffffffff' } }, + scenarios: { + a: { sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }] }, + }, scripts: {}, supported: ['BCH_2022_11_SPEC'], version: 0, } ); -test( +test.failing( 'Scenario, invalid data', testValidation, { @@ -1112,7 +1132,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid bytecode', testValidation, { @@ -1144,7 +1164,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid currentBlockHeight (string)', testValidation, { @@ -1157,7 +1177,7 @@ test( 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' ); -test( +test.failing( 'Scenario, invalid currentBlockHeight (negative)', testValidation, { @@ -1170,7 +1190,7 @@ test( 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' ); -test( +test.failing( 'Scenario, invalid currentBlockHeight (decimal)', testValidation, { @@ -1183,7 +1203,7 @@ test( 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' ); -test( +test.failing( 'Scenario, invalid currentBlockHeight (exceeds maximum)', testValidation, { @@ -1215,7 +1235,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid currentBlockTime (below minimum)', testValidation, { @@ -1247,7 +1267,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid data.hdKeys', testValidation, { @@ -1260,7 +1280,7 @@ test( 'If defined, the "data.hdKeys" property of scenario "a" must be an object.' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.addressIndex (string)', testValidation, { @@ -1273,7 +1293,7 @@ test( 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.addressIndex (negative)', testValidation, { @@ -1286,7 +1306,7 @@ test( 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.addressIndex (decimal)', testValidation, { @@ -1299,7 +1319,7 @@ test( 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.addressIndex (exceeds maximum)', testValidation, { @@ -1312,7 +1332,7 @@ test( 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.hdPublicKeys', testValidation, { @@ -1325,7 +1345,7 @@ test( 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.hdPublicKeys (non-string value)', testValidation, { @@ -1338,7 +1358,7 @@ test( 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.hdPrivateKeys', testValidation, { @@ -1351,7 +1371,7 @@ test( 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.' ); -test( +test.failing( 'Scenario, invalid data.hdKeys.hdPrivateKeys (non-string value)', testValidation, { @@ -1409,7 +1429,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid data.keys', testValidation, { @@ -1441,7 +1461,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid data.keys.privateKeys', testValidation, { @@ -1454,7 +1474,7 @@ test( 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.' ); -test( +test.failing( 'Scenario, invalid data.keys.privateKeys (non-string value)', testValidation, { @@ -1477,8 +1497,7 @@ test( data: { keys: { privateKeys: { - b: - '0000000000000000000000000000000000000000000000000000000000000001', + b: '0000000000000000000000000000000000000000000000000000000000000001', }, }, }, @@ -1495,8 +1514,7 @@ test( data: { keys: { privateKeys: { - b: - '0000000000000000000000000000000000000000000000000000000000000001', + b: '0000000000000000000000000000000000000000000000000000000000000001', }, }, }, @@ -1508,7 +1526,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid transaction', testValidation, { @@ -1540,7 +1558,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid transaction.locktime', testValidation, { @@ -1572,7 +1590,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid transaction.version', testValidation, { @@ -1604,7 +1622,7 @@ test( } ); -test( +test.failing( 'Scenario, invalid transaction.inputs (no inputs)', testValidation, { @@ -1617,7 +1635,7 @@ test( 'If defined, the "transaction.inputs" array of scenario "a" must have exactly one input under test (an "unlockingBytecode" set to "null").' ); -test( +test.failing( 'Scenario, invalid transaction.inputs (sparse array)', testValidation, { @@ -1633,7 +1651,7 @@ test( 'If defined, the "transaction.inputs" property of scenario "a" must be an array of scenario input objects.' ); -test( +test.failing( 'Scenario, invalid transaction input outpointIndex (negative)', testValidation, { @@ -1652,7 +1670,7 @@ test( 'If defined, the "outpointIndex" property of input 0 in scenario "a" must be a positive integer.' ); -test( +test.failing( 'Scenario, invalid transaction input outpointTransactionHash (non-string)', testValidation, { @@ -1671,7 +1689,7 @@ test( 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' ); -test( +test.failing( 'Scenario, invalid transaction input outpointTransactionHash (incorrect length)', testValidation, { @@ -1692,7 +1710,7 @@ test( 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' ); -test( +test.failing( 'Scenario, invalid transaction input sequenceNumber', testValidation, { @@ -1711,7 +1729,7 @@ test( 'If defined, the "sequenceNumber" property of input 0 in scenario "a" must be a number between 0 and 4294967295 (inclusive).' ); -test( +test.failing( 'Scenario, invalid transaction input unlockingBytecode', testValidation, { @@ -1779,7 +1797,7 @@ test( } ); -test( +test.failing( 'Scenario, empty transaction.outputs', testValidation, { @@ -1798,7 +1816,7 @@ test( 'If defined, the "transaction.outputs" property of scenario "a" must be have at least one output.' ); -test( +test.failing( 'Scenario, invalid transaction.outputs (sparse array)', testValidation, { @@ -1814,7 +1832,7 @@ test( 'If defined, the "transaction.outputs" property of scenario "a" must be an array of scenario output objects.' ); -test( +test.failing( 'Scenario, invalid transaction output lockingBytecode type', testValidation, { @@ -1833,7 +1851,7 @@ test( 'If defined, the "lockingBytecode" property of output 0 in scenario "a" must be a string or an object.' ); -test( +test.failing( 'Scenario, invalid transaction output lockingBytecode (non-hex)', testValidation, { @@ -1852,7 +1870,7 @@ test( 'If the "lockingBytecode" property of output 0 in scenario "a" is a string, it must be a valid, hexadecimal-encoded locking bytecode.' ); -test( +test.failing( 'Scenario, invalid transaction output lockingBytecode.script', testValidation, { @@ -1871,7 +1889,7 @@ test( 'If defined, the "script" property of output 0 in scenario "a" must be a hexadecimal-encoded string or "null".' ); -test( +test.failing( 'Scenario, invalid transaction output lockingBytecode.override', testValidation, { @@ -1890,7 +1908,7 @@ test( 'If defined, the "overrides" property of output 0 in scenario "a" must be an object.' ); -test( +test.failing( 'Scenario, invalid transaction output satoshis', testValidation, { @@ -1898,7 +1916,7 @@ test( scenarios: { a: { transaction: { - outputs: [{ satoshis: false }], + outputs: [{ valueSatoshis: false }], }, }, }, @@ -1906,7 +1924,7 @@ test( supported: ['BCH_2022_11_SPEC'], version: 0, }, - 'If defined, the "satoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "valueSatoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' ); test( @@ -1923,7 +1941,7 @@ test( overrides: { bytecode: { a: 'beef' } }, script: 'beef', }, - satoshis: 'ffffffffffffffff', + valueSatoshis: 'ffffffffffffffff', }, { lockingBytecode: {}, @@ -1950,7 +1968,7 @@ test( overrides: { bytecode: { a: 'beef' } }, script: 'beef', }, - satoshis: 'ffffffffffffffff', + valueSatoshis: 'ffffffffffffffff', }, { lockingBytecode: {}, @@ -1968,7 +1986,7 @@ test( } ); -test( +test.failing( 'built-in identifiers may not be re-used', testValidation, { @@ -1980,7 +1998,7 @@ test( 'Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: "current_block_height", "signing_serialization".' ); -test( +test.failing( 'all IDs must be unique', testValidation, { @@ -1993,7 +2011,7 @@ test( 'The ID of each entity, variable, script, and scenario in an authentication template must be unique. The following IDs are re-used: "b", "d".' ); -test( +test.failing( 'all entity script IDs must exist', testValidation, { @@ -2005,7 +2023,7 @@ test( 'Only known scripts may be assigned to entities. The following script IDs are not provided in this template: "b", "c".' ); -test( +test.failing( 'all scenarios reference by scripts must exist', testValidation, { @@ -2029,7 +2047,7 @@ test( ], }, c: { - lockingType: 'p2sh', + lockingType: 'p2sh20', script: '', }, }, @@ -2039,7 +2057,7 @@ test( 'Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: "s1", "s2", "s3", "s4", "s5", "s6", "s7".' ); -test( +test.failing( 'all entities referenced by data.hdKeys must exist', testValidation, { diff --git a/src/lib/schema/authentication-template.ts b/src/lib/schema/authentication-template.ts new file mode 100644 index 00000000..e077ca25 --- /dev/null +++ b/src/lib/schema/authentication-template.ts @@ -0,0 +1,42 @@ +import type { AuthenticationTemplate } from '../lib'; + +import { ajvStandaloneJsonParse } from './ajv/ajv-utils.js'; +// eslint-disable-next-line import/no-internal-modules +import AuthenticationTemplateValidator from './ajv/validate-authentication-template.js'; + +/** + * Safely parse and validate an authentication template, returning either an + * error message as a string or a valid {@link AuthenticationTemplate}. The + * template may be provided either as an untrusted JSON string or as a + * pre-parsed object. + * + * This method validates both the structure and the contents of a template: + * - All properties and sub-properties are verified to be of the expected type. + * - The template contains no unknown properties. + * - The ID of each entity, script, and scenario is confirmed to be unique. + * - Script IDs referenced by entities and other scripts (via `unlocks`) are + * confirmed to exist. + * - The derivation paths of each HdKey are validated against each other. + * + * This method does not validate the CashAssembly contents of scripts (by + * attempting compilation, evaluating {@link AuthenticationTemplateScriptTest}s, + * or testing scenario generation). + * + * @param untrustedJsonOrObject - the JSON string or object to validate as an + * authentication template + */ +export const importAuthenticationTemplate = ( + untrustedJsonOrObject: unknown +): AuthenticationTemplate | string => { + const errorPrefix = `Authentication template import failed:`; + const template = ajvStandaloneJsonParse( + untrustedJsonOrObject, + AuthenticationTemplateValidator + ); + if (typeof template === 'string') { + return `${errorPrefix}${template}`; + } + + // TODO: add back other validation + return template; +}; diff --git a/src/lib/schema/schema.ts b/src/lib/schema/schema.ts new file mode 100644 index 00000000..14f4ffdb --- /dev/null +++ b/src/lib/schema/schema.ts @@ -0,0 +1 @@ +export * from './authentication-template.js'; diff --git a/src/lib/template/bitauth-authentication-template.schema.json b/src/lib/template/bitauth-authentication-template.schema.json deleted file mode 100644 index 00a3ca96..00000000 --- a/src/lib/template/bitauth-authentication-template.schema.json +++ /dev/null @@ -1,617 +0,0 @@ -{ - "$ref": "#/definitions/AuthenticationTemplate", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "AuthenticationTemplate": { - "additionalProperties": false, - "description": "An `AuthenticationTemplate` (A.K.A. `Bitauth Template`) specifies a set of\nlocking scripts, unlocking scripts, and other information required to use a\ncertain authentication scheme. Templates fully describe wallets and protocols\nin a way that can be shared between software clients.", - "properties": { - "$schema": { - "description": "The URI which identifies the JSON Schema used by this template. Try:\n`https://bitauth.com/schemas/authentication-template-v0.schema.json`\nto enable documentation, autocompletion, and validation in JSON documents.", - "type": "string" - }, - "description": { - "description": "An optionally multi-line, free-form, human-readable description for this\nauthentication template (for use in user interfaces). If displayed, this\ndescription should use a monospace font to properly render ASCII diagrams.", - "type": "string" - }, - "entities": { - "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateEntity" - }, - "description": "A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use\n`snake_case`.", - "type": "object" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this authentication\ntemplate (for use in user interfaces).", - "type": "string" - }, - "scenarios": { - "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateScenario" - }, - "description": "A scenario describes a context in which one or more scripts might be used.\nScenarios are used for transaction estimation and as an integrated testing\nsystem for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use\n`snake_case`.", - "type": "object" - }, - "scripts": { - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/definitions/AuthenticationTemplateScript" - }, - { - "$ref": "#/definitions/AuthenticationTemplateScriptUnlocking" - }, - { - "$ref": "#/definitions/AuthenticationTemplateScriptLocking" - }, - { - "$ref": "#/definitions/AuthenticationTemplateScriptTested" - } - ] - }, - "description": "A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use\n`snake_case`.", - "type": "object" - }, - "supported": { - "description": "A list of authentication virtual machine versions supported by this\ntemplate.\n\nVirtual machine identifiers use the format `CODE_YYYY_MM`, where `CODE` is\nthe currency code used to identify the network, and `YYYY_MM` is the year\nand month in which the specified VM version became active on the indicated\nnetwork.\n\nIdentifiers with the `_SPEC` suffix indicate that this template is intended\nfor compatibility with a future virtual machine version, but at the time\nthe template was create, that virtual machine had not yet become active on\nthe specified chain.\n\nThe earliest possible `_SPEC` virtual machine version is `BCH_2020_11_SPEC`,\nthe first virtual machine version after the public release of the version `0`\nAuthenticationTemplate format.", - "items": { - "$ref": "#/definitions/AuthenticationVirtualMachineIdentifier" - }, - "type": "array" - }, - "version": { - "description": "A number identifying the format of this AuthenticationTemplate.\nCurrently, this implementation requires `version` be set to `0`.", - "enum": [ - 0 - ], - "type": "number" - } - }, - "required": [ - "entities", - "scripts", - "supported", - "version" - ], - "type": "object" - }, - "AuthenticationTemplateAddressData": { - "additionalProperties": false, - "properties": { - "description": { - "description": "A single-line, human readable description for this address data.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this address data.", - "type": "string" - }, - "type": { - "description": "`AddressData` is the most low-level variable type. It must be collected\nand stored each time a script is generated (usually, a locking script).\n`AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.", - "enum": [ - "AddressData" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "AuthenticationTemplateEntity": { - "additionalProperties": false, - "description": "An object describing the configuration for a particular entity within an\nauthentication template.", - "properties": { - "description": { - "description": "An optionally multi-line, free-form, human-readable description for this\nentity (for use in user interfaces). If displayed, this description\nshould use a monospace font to properly render ASCII diagrams.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this entity for use in\nuser interfaces and error messages, e.g.: `Trusted Third-Party`.", - "type": "string" - }, - "scripts": { - "description": "An array of the identifiers of each script the entity must be capable of\ngenerating, e.g. each of the unlocking scripts this entity might use.\n\nProvided the necessary variables, any entity can construct any script, but\nthis option allows us to hint to more advanced wallets which scripts to\nrecommend to users. (Especially when many scripts require inter-entity\ncommunication initiated by a user.)\n\nIf not provided, this property is assumed to include all scripts in the\ntemplate.", - "items": { - "type": "string" - }, - "type": "array" - }, - "variables": { - "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateVariable" - }, - "description": "A map of variables which must be provided by this entity for use in the\ntemplate's scripts. Some variables are required before locking script\ngeneration, while some variables can or must be resolved only before\nunlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use\n`snake_case`.", - "type": "object" - } - }, - "type": "object" - }, - "AuthenticationTemplateHdKey": { - "additionalProperties": false, - "properties": { - "addressOffset": { - "description": "The offset by which to increment the `addressIndex` provided in the\ncompilation data when deriving this `HdKey`. (Default: 0)\n\nThis is useful for deriving the \"next\" (`1`) or \"previous\" (`-1`) address\nto be used in the current compilation context.", - "type": "number" - }, - "description": { - "description": "A single-line, human readable description for this HD key.", - "type": "string" - }, - "hdPublicKeyDerivationPath": { - "description": "The path to derive the entity's HD public key from the entity's master HD\nprivate key. By default, `m` (i.e. the entity's HD public key represents\nthe same node in the HD tree as its HD private key).\n\nThis can be used to specify another derivation path from which the\n`publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See\n`publicDerivationPath` for details.\n\nThis path must begin with an `m` (private derivation) and be fixed – it\ncannot contain an `i` character to represent the address index, as a\ndynamic hardened path would require a new HD public key for each address.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this HD key.", - "type": "string" - }, - "privateDerivationPath": { - "description": "The derivation path used to derive this `HdKey` from the owning entity's HD\nprivate key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to\nrepresent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of\n`/` and a number representing the child index used in the derivation at\nthat depth. Hardened derivation is represented by a trailing `'`, and\nhardened child indexes are represented with the hardened index offset\n(`2147483648`) subtracted. The `i` character is replaced with the value of\n`addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is\nfollowed by `'`, the hardened index offset is added (`2147483648`) and\nhardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in\nthe following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey`\nvariables with `derivationPath`s which include hardened derivation cannot\nuse HD public derivation (the `hdPublicKeys` property in\n`CompilationData`). Instead, compilation requires the respective HD private\nkey (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public\nkey (`CompilationData.hdKeys.derivedPublicKeys`).", - "type": "string" - }, - "publicDerivationPath": { - "description": "The derivation path used to derive this `HdKey`'s public key from the\nowning entity's HD public key. If not set, the public equivalent of\n`privateDerivationPath` is used. For the `privateDerivationPath` default of\n`m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but\nlater derivation levels use non-hardened derivation, `publicDerivationPath`\ncan be used to specify a public derivation path beginning from\n`hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a\nnon-hardened segment of `privateDerivationPath` which follows\n`hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of\n`/` and a number representing the child index used in the non-hardened\nderivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to\nderive the equivalent public key with only the HD public key `M`. (The path\n\"`M/0'/i`\" is impossible). However, given the HD public key for `m/0'`, it\nis possible to derive the public key of `m/0'/i` for any `i`. In this case,\n`hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath`\nwould be the remaining `M/i`.", - "type": "string" - }, - "type": { - "description": "The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key\ngeneration and mapping in a standard way. For greater control, use `Key`.", - "enum": [ - "HdKey" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "AuthenticationTemplateKey": { - "additionalProperties": false, - "properties": { - "description": { - "description": "A single-line, human readable description for this key.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this key.", - "type": "string" - }, - "type": { - "description": "The `Key` type provides fine-grained control over key generation and\nmapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of\nthe templating system and provided at the time of use.", - "enum": [ - "Key" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "AuthenticationTemplateScenario": { - "additionalProperties": false, - "description": "An object describing the configuration for a particular scenario within an\nauthentication template.", - "properties": { - "data": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", - "description": "An object defining the data to use while compiling this scenario. The\nproperties specified here are used to extend the existing scenario data\nbased on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set\nproperty, the property must be individually overridden in this object." - }, - "description": { - "description": "An optionally multi-line, free-form, human-readable description for this\nscenario (for use in user interfaces). If displayed, this description\nshould use a monospace font to properly render ASCII diagrams.", - "type": "string" - }, - "extends": { - "description": "The identifier of the scenario which this scenario extends. Any `data` or\n`transaction` properties not defined in this scenario inherit from the\nextended parent scenario.\n\nIf undefined, this scenario is assumed to extend the default scenario:\n\n- The default values for `data` are set:\n - The identifiers of all `Key` variables and entities in this template\nare lexicographically sorted, then each is assigned an incrementing\npositive integer – beginning with `1` – encoded as an unsigned, 256-bit,\nbig-endian integer (i.e. `0x0000...0001` (32 bytes), `0x0000...0002`,\n`0x0000...0003`, etc.). For `Key`s, this assigned value is used as the\nprivate key; For entities, the assigned value is used as the master seed of\nthat entity's `HdPrivateKey`. If `hdKey` is set, the `addressIndex` is set\nto `0`.\n - `currentBlockHeight` is set to `2`. This is the height of the second\nmined block after the genesis block:\n`000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. This\ndefault value was chosen to be low enough to simplify the debugging of\nblock height offsets while remaining differentiated from `0` and `1` which\nare used both as boolean return values and for control flow.\n - `currentBlockTime` is set to `1231469665`. This is the Median Time-Past\nblock time (BIP113) of block `2`.\n\n- Then `transaction` is set based on use:\n - if the scenario is being used for transaction estimation, all\ntransaction properties are taken from the transaction being estimated.\n - if the scenario is being used for script testing and validation, the\ndefault value for each `transaction` property used.\n\nWhen a scenario is extended, each property of `data` and `transaction` is\nextended individually: if the extending scenario does not provide a new\nvalue for `data.bytecode.value` or `transaction.property`, the parent value\nis used. To avoid inheriting a parent value, each child value must be\nindividually overridden.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this scenario for use in\nuser interfaces, e.g.: `Delayed Recovery`.", - "type": "string" - }, - "transaction": { - "additionalProperties": false, - "description": "The transaction within which this scenario should be evaluated. This is\nused for script testing and validation.\n\nIf undefined, inherits the default value for each property:\n```json\n{\n \"inputs\": [{ \"unlockingBytecode\": null }],\n \"locktime\": 0,\n \"outputs\": [{ \"lockingBytecode\": \"\" }],\n \"version\": 2\n}\n```\n\nAny `transaction` property which is not set will be inherited from the\nscenario specified by `extends`. when specifying the `inputs` and `outputs`\nproperties, each input and output extends the default values for inputs and\noutputs, respectively.\n\nFor example, an input of `{}` is interpreted as:\n```json\n{\n \"outpointIndex\": 0,\n \"outpointTransactionHash\":\n \"0000000000000000000000000000000000000000000000000000000000000000\",\n \"sequenceNumber\": 0\n}\n```\nAnd an output of `{}` is interpreted as:\n```json\n{\n \"lockingBytecode\": {\n \"script\": null,\n \"overrides\": { \"hdKeys\": { \"addressIndex\": 1 } }\n },\n \"satoshis\": 0\n}\n```", - "properties": { - "inputs": { - "description": "The list of inputs to use when generating the transaction context for\nthis scenario.\n\nTo be valid the `inputs` property must have exactly one input with\n`unlockingBytecode` set to `null`. This is the input in which the\nunlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value:\n`[{ \"unlockingBytecode\": null }]`.", - "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioInput" - }, - "type": "array" - }, - "locktime": { - "description": "The locktime to use when generating the transaction context for this\nscenario. A positive integer from `0` to a maximum of `4294967295` – if\nundefined, defaults to `0`.\n\nLocktime can be provided as either a timestamp or a block height. Values\nless than `500000000` are understood to be a block height (the current\nblock number in the chain, beginning from block `0`). Values greater than\nor equal to `500000000` are understood to be a UNIX timestamp.\n\nFor validating timestamp values, the median timestamp of the last 11\nblocks (Median Time-Past) is used. The precise behavior is defined in\nBIP113.\n\nIf the `sequenceNumber` of every transaction input is set to `0xffffffff`\n(`4294967295`), locktime is disabled, and the transaction may be added to\na block even if the specified locktime has not yet been reached. When\nlocktime is disabled, if an `OP_CHECKLOCKTIMEVERIFY` operation is\nencountered during the verification of any input, an error is produced,\nand the transaction is invalid.", - "type": "number" - }, - "outputs": { - "description": "The list of outputs to use when generating the transaction context for\nthis scenario.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": \"\" }]`.", - "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioOutput" - }, - "type": "array" - }, - "version": { - "description": "The version to use when generating the transaction context for this\nscenario. A positive integer from `0` to a maximum of `4294967295` – if\nundefined, inherits the default scenario `version` value: `2`.", - "type": "number" - } - }, - "type": "object" - }, - "value": { - "description": "The value in satoshis of the hypothetical output being spent by the input\nunder test in this scenario.\n\nMay be encoded as either a number (for values below `2^53-1`) or a\nlittle-endian, unsigned 64-bit integer in hexadecimal format (a\n16-character string).\n\nIf undefined, defaults to `0`.", - "type": [ - "number", - "string" - ] - } - }, - "type": "object" - }, - "AuthenticationTemplateScenarioData": { - "additionalProperties": false, - "description": "An object defining the data to use while compiling a scenario.", - "properties": { - "bytecode": { - "additionalProperties": { - "type": "string" - }, - "description": "A map of full identifiers to scripts which compile to their values for this\nscenario.\n\nScripts are provided in BTL, and have access to each other and all other\ntemplate scripts and defined variables. However, cyclical references will\nproduce an error at compile time. Also, because the results of these\ncompilations will be used to generate the transaction context for this\nscenario, these scripts may not use compiler operations which themselves\nrequire access to transaction context (e.g. signatures).\n\nThe provided `fullIdentifier` should match the complete identifier for\neach item, e.g. `some_wallet_data`, `variable_id.public_key`, or\n`variable_id.signature.all_outputs`.\n\nAll `AddressData` and `WalletData` variables must be provided via\n`bytecode`, and pre-computed results for operations of other variable types\n(e.g. `key.public_key`) may also be provided via this property.\n\nBecause each bytecode identifier may precisely match the identifier of the\nvariable it defines for this scenario, references between these scripts\nmust refer to the target script with a `_scenario_` prefix. E.g. to\nreference a sibling script `my_foo` from `my_bar`, the `my_bar` script must\nuse the identifier `_scenario_my_foo`.", - "type": "object" - }, - "currentBlockHeight": { - "description": "The current block height at the \"address creation time\" implied in this\nscenario.", - "type": "number" - }, - "currentBlockTime": { - "description": "The current MTP block time as a UNIX timestamp at the \"address creation\ntime\" implied in this scenario.\n\nNote, this is never a current timestamp, but rather the median timestamp of\nthe last 11 blocks. It is therefore approximately one hour in the past.\n\nEvery block has a precise MTP block time, much like a block height. See\nBIP113 for details.", - "type": "number" - }, - "hdKeys": { - "additionalProperties": false, - "description": "An object describing the settings used for `HdKey` variables in this\nscenario.", - "properties": { - "addressIndex": { - "description": "The current address index to be used for this scenario. The\n`addressIndex` gets added to each `HdKey`s `addressOffset` to calculate\nthe dynamic index (`i`) used in each `privateDerivationPath` or\n`publicDerivationPath`.\n\nThis is required for any compiler operation which requires derivation.\nTypically, the value is incremented by one for each address in a wallet.", - "type": "number" - }, - "hdPrivateKeys": { - "additionalProperties": { - "type": "string" - }, - "description": "A map of entity IDs to master HD private keys. These master HD private\nkeys are used to derive each `HdKey` variable assigned to that entity\naccording to its `privateDerivationPath`.\n\nHD private keys may be encoded for either mainnet or testnet (the network\ninformation is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in\n`hdPublicKeys`) are provided for the same entity in the same scenario\n(not recommended), the HD private key is used.", - "type": "object" - }, - "hdPublicKeys": { - "additionalProperties": { - "type": "string" - }, - "description": "A map of entity IDs to HD public keys. These HD public keys are used to\nderive public keys for each `HdKey` variable assigned to that entity\naccording to its `publicDerivationPath`.\n\nHD public keys may be encoded for either mainnet or testnet (the network\ninformation is ignored).\n\nIf both an HD private key (in `hdPrivateKeys`) and HD public key (in\n`hdPublicKeys`) are provided for the same entity in the same scenario\n(not recommended), the HD private key is used.", - "type": "object" - } - }, - "type": "object" - }, - "keys": { - "additionalProperties": false, - "description": "An object describing the settings used for `Key` variables in this\nscenario.", - "properties": { - "privateKeys": { - "additionalProperties": { - "type": "string" - }, - "description": "A map of `Key` variable IDs to their 32-byte, hexadecimal-encoded private\nkey values.", - "type": "object" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "AuthenticationTemplateScenarioInput": { - "additionalProperties": false, - "description": "An example input used to define a scenario for an authentication template.", - "properties": { - "outpointIndex": { - "description": "The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to `0`.", - "type": "number" - }, - "outpointTransactionHash": { - "description": "A 32-byte, hexadecimal-encoded hash of the transaction from which this\ninput is spent in big-endian byte order. This is the byte order typically\nseen in block explorers and user interfaces (as opposed to little-endian\nbyte order, which is used in standard P2P network messages).\n\nIf undefined, this defaults to the \"empty\" hash:\n`0000000000000000000000000000000000000000000000000000000000000000`\n\nA.K.A. Outpoint `Transaction ID`", - "type": "string" - }, - "sequenceNumber": { - "description": "The positive, 32-bit unsigned integer used as the \"sequence number\" for\nthis input.\n\nIf undefined, this defaults to `0`.", - "type": "number" - }, - "unlockingBytecode": { - "description": "The `unlockingBytecode` value of this input for this scenario. This must be\neither a `null` value – indicating that this input contains the\n`unlockingBytecode` under test by the scenario – or a hexadecimal-encoded\nbytecode value.\n\nDefaults to an empty string (`''`). For a scenario to be valid,\n`unlockingBytecode` must be `null` for exactly one input in the scenario.", - "type": [ - "null", - "string" - ] - } - }, - "type": "object" - }, - "AuthenticationTemplateScenarioOutput": { - "additionalProperties": false, - "description": "An example output used to define a scenario for an authentication template.", - "properties": { - "lockingBytecode": { - "anyOf": [ - { - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "overrides": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", - "description": "Scenario data which extends this scenario's top-level data during\nscript compilation.\n\nEach property is extended individually – to modify a property set by\nthe top-level scenario data, the new value must be listed here.\n\nIf undefined, defaults to `{ \"hdKeys\": { \"addressIndex\": 1 } }`." - }, - "script": { - "description": "The identifier of the script to compile when generating this\n`lockingBytecode`. May also be set to `null`, which represents the\nidentifier of the locking script unlocked by the unlocking script\nunder test.\n\nIf undefined, defaults to `null`.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - } - ], - "description": "The bytecode used to encumber this transaction output for this scenario.\nThis value is included in signing serializations, and therefore has an\neffect on the transaction context for this scenario.\n\nThis value may be provided as either a hexadecimal-encoded string or an\nobject describing the required compilation.\n\nIf undefined, this defaults to `{}`, which uses the default values for\n`script` and `overrides`, respectively." - }, - "satoshis": { - "description": "The value of the output in satoshis, the smallest unit of bitcoin.\n\nIn a valid transaction, this is a positive integer, from `0` to the maximum\nnumber of satoshis available to the transaction.\n\nThe maximum number of satoshis in existence is about 1/4 of\n`Number.MAX_SAFE_INTEGER` (`9007199254740991`), so typically, this value\nis defined using a `number`. However, this value may also be defined using\na 16-character, hexadecimal-encoded `string`, to allow for the full range\nof the 64-bit unsigned, little-endian integer used to serialize `satoshis`\nin the encoded output format, e.g. `\"ffffffffffffffff\"`. This is useful\nfor representing scenarios where intentionally excessive values are\nprovided (to ensure an otherwise properly-signed transaction can never be\nincluded in the blockchain), e.g. transaction size estimations or off-chain\nBitauth signatures.\n\nIf undefined, this defaults to: `0`.", - "type": [ - "number", - "string" - ] - } - }, - "type": "object" - }, - "AuthenticationTemplateScript": { - "additionalProperties": false, - "description": "An object describing the configuration for a particular script within an\nauthentication template.", - "properties": { - "name": { - "description": "A single-line, human-readable name for this script (for use in user\ninterfaces).", - "type": "string" - }, - "script": { - "description": "The script definition in BTL (Bitauth Templating Language).", - "type": "string" - } - }, - "required": [ - "script" - ], - "type": "object" - }, - "AuthenticationTemplateScriptLocking": { - "additionalProperties": false, - "properties": { - "lockingType": { - "description": "Indicates if P2SH infrastructure should be used when producing bytecode\nrelated to this script. For more information on P2SH, see BIP16.\n\nWhen compiling locking scripts of type `p2sh`, the result will be placed in\na P2SH \"redeem script\" format:\n`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`\n\nWhen compiling unlocking scripts which unlock locking scripts of type\n`p2sh`, the result will be transformed into the P2SH unlocking format:\n`unlockingBytecode ` (where `lockingBytecode` is the\ncompiled bytecode of the locking script, without the \"redeem script\"\ntransformation.)\n\nThe presence of the `lockingType` property indicates that this script is a\nlocking script. It must be present on any script referenced by the\n`unlocks` property of another script.", - "enum": [ - "standard", - "p2sh" - ], - "type": "string" - }, - "name": { - "description": "A single-line, human-readable name for this script (for use in user\ninterfaces).", - "type": "string" - }, - "script": { - "description": "The script definition in BTL (Bitauth Templating Language).", - "type": "string" - } - }, - "required": [ - "lockingType", - "script" - ], - "type": "object" - }, - "AuthenticationTemplateScriptTest": { - "additionalProperties": false, - "properties": { - "check": { - "description": "The script to evaluate after the script being tested. This can be used to\ncheck that the tested script leaves the expected results on the stack. For\nexample, if the tested script is expected to leave 3 items of a specific\nsize on the stack, the `check` script could pop each resulting item from\nthe stack and examine it for correctness.\n\nIn scenario testing, this script is appended to the script under test, and\ntogether they are treated as the locking script. Program evaluation is\nconsidered successful if the resulting program state can be verified by the\nvirtual machine (e.g. the resulting stack contains a single `1`, no errors\nare produced, etc.).", - "type": "string" - }, - "fails": { - "description": "A list of the scenario identifiers which – when used to compile this\ntest and the script it tests – result in bytecode which fails program\nverification. The `setup` script is used in place of an unlocking\nscript, and the concatenation of the script under test and the `check`\nscript are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "invalid": { - "description": "A list of the scenario identifiers which – when used to compile this\ntest and the script it tests – result in a compilation error. The `setup`\nscript is used in place of an unlocking script, and the concatenation of\nthe script under test and the `check` script are used in place of a locking\nscript.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this test (for use in\nuser interfaces).", - "type": "string" - }, - "passes": { - "description": "A list of the scenario identifiers which – when used to compile this\ntest and the script it tests – result in bytecode which passes program\nverification. The `setup` script is used in place of an unlocking\nscript, and the concatenation of the script under test and the `check`\nscript are used in place of a locking script.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "setup": { - "description": "A script to evaluate before the script being tested. This can be used to\npush values to the stack which are operated on by the tested script.\n\nIn scenario testing, this script is treated as the unlocking script.", - "type": "string" - } - }, - "required": [ - "check" - ], - "type": "object" - }, - "AuthenticationTemplateScriptTested": { - "additionalProperties": false, - "properties": { - "name": { - "description": "A single-line, human-readable name for this script (for use in user\ninterfaces).", - "type": "string" - }, - "pushed": { - "description": "If set to `true`, indicates that this script should be wrapped in a push\nstatement for testing.\n\nThis is useful for scripts which serve as \"bytecode templates\" – e.g.\nformatted messages or signature preimages. These scripts are typically not\nevaluated as bytecode but appear within push statements elsewhere in the\ntemplate.\n\nDefaults to `false`.", - "type": "boolean" - }, - "script": { - "description": "The script definition in BTL (Bitauth Templating Language).", - "type": "string" - }, - "tests": { - "description": "One or more tests which can be used during development and during template\nvalidation to confirm the correctness of this inline script.", - "items": { - "$ref": "#/definitions/AuthenticationTemplateScriptTest" - }, - "type": "array" - } - }, - "required": [ - "script", - "tests" - ], - "type": "object" - }, - "AuthenticationTemplateScriptUnlocking": { - "additionalProperties": false, - "properties": { - "ageLock": { - "description": "TODO: not yet implemented\n\nThe minimum input age required for this unlocking script to become valid.\n\nThis value is provided as a BTL script which must compile to the least\nsignificant 3 bytes of the minimum sequence number required for this\nunlocking script to be valid (the \"type bit\" and the 2-byte \"value\" – see\nBIP68 for details). This script has access to all other template scripts\nand variables, but cyclical references will produce an error at compile\ntime.\n\nIn supporting wallets, this value can be computed at address creation\ntime, and the remaining time for which any UTXO remains \"age-locked\" can be\ndisplayed in user interfaces (by parsing the \"type bit\" and \"value\" as\ndescribed in BIP68).\n\nNote, because the precise value used by `OP_CHECKSEQUENCEVERIFY` can be\nprovided in the unlocking script, it is trivial to create an unlocking\nscript for which a proper value for `ageLock` is not possible to determine\nuntil the spending transaction is prepared. These cases are intentionally\nout-of-scope for this property. Instead, `ageLock` should only be used\nfor unlocking scripts where the expected value can be compiled at address\ncreation time.", - "type": "string" - }, - "estimate": { - "description": "The identifier of the scenario to use for this unlocking script when\ncompiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute\nan \"estimated transaction\", an invalid transaction which is guaranteed to\nbe the same byte length as the final transaction. This length can be used\nto calculate the required transaction fee and assign values to the\ntransaction's change output(s). Because estimate scenarios provide\n\"estimated\" values for all variables, this estimation can be done by a\nsingle entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The\ndefault scenario only provides values for each `Key` and `HdKey` variable,\nso compilations requiring other variables will produce errors. See\n`AuthenticationTemplateScenario.extends` for details.", - "type": "string" - }, - "fails": { - "description": "A list of the scenario identifiers which – when used to compile this\nunlocking script and the script it unlocks – result in bytecode which fails\nprogram verification.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "invalid": { - "description": "A list of the scenario identifiers which – when used to compile this\nunlocking script and the script it unlocks – result in a compilation error.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "description": "A single-line, human-readable name for this script (for use in user\ninterfaces).", - "type": "string" - }, - "passes": { - "description": "A list of the scenario identifiers which – when used to compile this\nunlocking script and the script it unlocks – result in bytecode which\npasses program verification.\n\nThese scenarios can be used to test this script in development and review.", - "items": { - "type": "string" - }, - "type": "array" - }, - "script": { - "description": "The script definition in BTL (Bitauth Templating Language).", - "type": "string" - }, - "timeLockType": { - "description": "The expected type of time locks in this script.\n\nBecause `OP_CHECKLOCKTIMEVERIFY` reads from a transaction's `locktime`\nproperty, every input to a given transaction must share the same time lock\ntype. This differs from `OP_CHECKSEQUENCEVERIFY` in that each input has its\nown `sequenceNumber`, so compatibility is not required.\n\nIf a transaction includes multiple inputs using scripts with `timeLockType`\ndefined, and the types are not compatible, generation should fail.\n\nThe `timestamp` type indicates that the transaction's locktime is provided\nas a UNIX timestamp (the `locktime` value is greater than or equal to\n`500000000`).\n\nThe `height` type indicates that the transaction's locktime is provided as\na block height (the `locktime` value is less than `500000000`).\n\nIf `timeLockType` is undefined, the script is assumed to have no reliance\non absolute time locks.", - "enum": [ - "timestamp", - "height" - ], - "type": "string" - }, - "unlocks": { - "description": "The identifier of the script which can be unlocked by this script.\n\nThe presence of the `unlocks` property indicates that this script is an\nunlocking script, and the script it unlocks must be a locking script.", - "type": "string" - } - }, - "required": [ - "script", - "unlocks" - ], - "type": "object" - }, - "AuthenticationTemplateVariable": { - "anyOf": [ - { - "$ref": "#/definitions/AuthenticationTemplateHdKey" - }, - { - "$ref": "#/definitions/AuthenticationTemplateKey" - }, - { - "$ref": "#/definitions/AuthenticationTemplateWalletData" - }, - { - "$ref": "#/definitions/AuthenticationTemplateAddressData" - } - ] - }, - "AuthenticationTemplateWalletData": { - "additionalProperties": false, - "properties": { - "description": { - "description": "A single-line, human readable description for this wallet data.", - "type": "string" - }, - "name": { - "description": "A single-line, Title Case, human-readable name for this wallet data.", - "type": "string" - }, - "type": { - "description": "The `WalletData` type provides a static piece of data which should be\ncollected once and stored at the time of wallet creation. `WalletData`\nshould be persistent for the life of the wallet, rather than changing from\nlocking script to locking script.\n\nFor address-specific data, use `AddressData`.", - "enum": [ - "WalletData" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "AuthenticationVirtualMachineIdentifier": { - "description": "Allowable identifiers for authentication virtual machine versions. The `BCH`\nprefix identifies the Bitcoin Cash network, the `BSV` prefix identifies the\nBitcoin SV network, and the `BTC` prefix identifies the Bitcoin (Core)\nnetwork.\n\nVirtual machine versions may be marked with the `SPEC` suffix to indicate\nthat they have not yet been deployed to a main network and are therefore only\na draft specification. After deployment, when template compatibility is\nverified, templates should update their `supported` array to indicate\ncompatibility with the live virtual machine version.", - "enum": [ - "BCH_2022_11_SPEC", - "BCH_2022_11", - "BCH_2022_05_SPEC", - "BCH_2022_05", - "BCH_2021_11_SPEC", - "BCH_2021_11", - "BCH_2021_05_SPEC", - "BCH_2021_05", - "BCH_2020_11_SPEC", - "BCH_2020_11", - "BCH_2020_05", - "BCH_2019_11", - "BCH_2019_05", - "BSV_2020_02", - "BSV_2018_11", - "BTC_2017_08" - ], - "type": "string" - } - } -} \ No newline at end of file diff --git a/src/lib/template/compiler-bch/compiler-bch.e2e.spec.helper.ts b/src/lib/template/compiler-bch/compiler-bch.e2e.spec.helper.ts deleted file mode 100644 index 1777850e..00000000 --- a/src/lib/template/compiler-bch/compiler-bch.e2e.spec.helper.ts +++ /dev/null @@ -1,117 +0,0 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ -import { Macro } from 'ava'; - -import { - AuthenticationProgramStateBCH, - BytecodeGenerationResult, - CompilationData, - CompilationEnvironment, - CompilationEnvironmentBCH, - compilerOperationsBCH, - createAuthenticationProgramEvaluationCommon, - createCompiler, - createTransactionContextCommonTesting, - generateBytecodeMap, - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha256, - instantiateSha512, - instantiateVirtualMachineBCH, - instructionSetBCHCurrentStrict, - OpcodesBCH, - stringifyTestVector, - TransactionContextBCH, - TransactionContextCommon, -} from '../../lib'; - -/** - * `m` - */ -export const hdPrivateKey = - 'xprv9s21ZrQH143K2PfMvkNViFc1fgumGqBew45JD8SxA59Jc5M66n3diqb92JjvaR61zT9P89Grys12kdtV4EFVo6tMwER7U2hcUmZ9VfMYPLC'; -/** - * `m` - */ -export const hdPublicKey = - 'xpub661MyMwAqRbcEsjq2muW5PYkDikFgHuWJGzu1WrZiQgHUsgEeKMtGducsZe1iRsGAGNGDzmWYDM69ya24LMyR7mDhtzqQsc286XEQfM2kkV'; - -/** - * `m/0` - */ -// prettier-ignore -export const privkey = new Uint8Array([0xf8, 0x5d, 0x4b, 0xd8, 0xa0, 0x3c, 0xa1, 0x06, 0xc9, 0xde, 0xb4, 0x7b, 0x79, 0x18, 0x03, 0xda, 0xc7, 0xf0, 0x33, 0x38, 0x09, 0xe3, 0xf1, 0xdd, 0x04, 0xd1, 0x82, 0xe0, 0xab, 0xa6, 0xe5, 0x53]); - -const ripemd160Promise = instantiateRipemd160(); -const sha256Promise = instantiateSha256(); -const sha512Promise = instantiateSha512(); -const secp256k1Promise = instantiateSecp256k1(); -const vmPromise = instantiateVirtualMachineBCH(instructionSetBCHCurrentStrict); - -/** - * Uses `createCompiler` rather than `createCompilerBCH` for performance. - */ -export const expectCompilationResult: Macro<[ - string, - CompilationData, - BytecodeGenerationResult, - CompilationEnvironment['variables']?, - Partial>? -]> = async ( - t, - testScript, - otherData, - expectedResult, - variables, - environmentOverrides - // eslint-disable-next-line max-params -) => { - const ripemd160 = await ripemd160Promise; - const sha256 = await sha256Promise; - const sha512 = await sha512Promise; - const secp256k1 = await secp256k1Promise; - const vm = await vmPromise; - - const compiler = createCompiler< - TransactionContextBCH, - CompilationEnvironmentBCH, - OpcodesBCH, - AuthenticationProgramStateBCH - >({ - createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - entityOwnership: { - one: 'ownerEntityOne', - owner: 'ownerEntityId', - two: 'ownerEntityTwo', - }, - opcodes: generateBytecodeMap(OpcodesBCH), - operations: compilerOperationsBCH, - ripemd160, - scripts: { - another: '0xabcdef', - broken: 'does_not_exist', - lock: '', - test: testScript, - }, - secp256k1, - sha256, - sha512, - unlockingScripts: { - test: 'lock', - }, - variables, - vm, - ...environmentOverrides, - }); - - const resultUnlock = compiler.generateBytecode('test', { - transactionContext: createTransactionContextCommonTesting(), - ...otherData, - }); - t.deepEqual( - resultUnlock, - expectedResult, - `– \nResult: ${stringifyTestVector( - resultUnlock - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` - ); -}; diff --git a/src/lib/template/compiler-operation-helpers.ts b/src/lib/template/compiler-operation-helpers.ts deleted file mode 100644 index 9f498659..00000000 --- a/src/lib/template/compiler-operation-helpers.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { decodeHdPrivateKey, deriveHdPath } from '../key/hd-key'; -import { TransactionContextCommon } from '../transaction/transaction-types'; - -import { CompilerDefaults } from './compiler-defaults'; -import { - AnyCompilationEnvironment, - CompilationData, - CompilationEnvironment, - CompilerOperation, - CompilerOperationErrorFatal, - CompilerOperationResult, - CompilerOperationSkip, -} from './compiler-types'; -import { resolveScriptIdentifier } from './language/resolve'; -import { AuthenticationTemplateHdKey } from './template-types'; - -/** - * Attempt a series of compiler operations, skipping to the next operation if - * the current operation returns a `CompilerOperationSkip` (indicating it failed - * and can be skipped). The `finalOperation` may not be skipped, and must either - * return `CompilerOperationSuccess` or `CompilerOperationError`. - * - * @param operations - an array of skippable operations to try - * @param finalOperation - a final, un-skippable operation - */ -export const attemptCompilerOperations = < - TransactionContext = TransactionContextCommon ->( - operations: CompilerOperation[], - finalOperation: CompilerOperation -): CompilerOperation => (identifier, data, environment) => { - // eslint-disable-next-line functional/no-loop-statement - for (const operation of operations) { - const result = operation(identifier, data, environment); - if (result.status !== 'skip') return result; - } - return finalOperation(identifier, data, environment); -}; - -/** - * Modify a compiler operation to verify that certain properties exist in the - * `CompilationData` and `CompilationEnvironment` before executing the provided - * operation. If the properties don't exist, an error message is returned. - * - * This is useful for eliminating repetitive existence checks. - * - * @param canBeSkipped - if `true`, the accepted operation may return `false`, - * and any missing properties will cause the returned operation to return - * `false` (meaning the operation should be skipped) - * @param dataProperties - an array of the top-level properties required in the - * `CompilationData` - * @param environmentProperties - an array of the top-level properties required - * in the `CompilationEnvironment` - * @param operation - the operation to run if all required properties exist - */ -export const compilerOperationRequires = < - CanBeSkipped extends boolean, - RequiredDataProperties extends keyof CompilationData, - RequiredEnvironmentProperties extends keyof CompilationEnvironment, - TransactionContext = TransactionContextCommon ->({ - canBeSkipped, - dataProperties, - environmentProperties, - operation, -}: { - canBeSkipped: CanBeSkipped; - dataProperties: RequiredDataProperties[]; - environmentProperties: RequiredEnvironmentProperties[]; - operation: ( - identifier: string, - data: Required< - Pick, RequiredDataProperties> - > & - CompilationData, - environment: Required< - Pick< - CompilationEnvironment, - RequiredEnvironmentProperties - > - > & - CompilationEnvironment - ) => CompilerOperationResult; - // eslint-disable-next-line complexity -}): CompilerOperation => ( - identifier, - data, - environment -) => { - // eslint-disable-next-line functional/no-loop-statement - for (const property of environmentProperties) { - if (environment[property] === undefined) - return (canBeSkipped - ? { status: 'skip' } - : { - error: `Cannot resolve "${identifier}" – the "${property}" property was not provided in the compilation environment.`, - status: 'error', - }) as CanBeSkipped extends true - ? CompilerOperationSkip - : CompilerOperationErrorFatal; - } - // eslint-disable-next-line functional/no-loop-statement - for (const property of dataProperties) { - if ( - (data[property] as typeof data[typeof property] | undefined) === undefined - ) - return (canBeSkipped - ? { status: 'skip' } - : { - error: `Cannot resolve "${identifier}" – the "${property}" property was not provided in the compilation data.`, - status: 'error', - }) as CanBeSkipped extends true - ? CompilerOperationSkip - : CompilerOperationErrorFatal; - } - - return operation( - identifier, - data as Required< - Pick, RequiredDataProperties> - >, - environment as Required< - Pick< - CompilationEnvironment, - RequiredEnvironmentProperties - > - > & - CompilationEnvironment - ); -}; - -export const compilerOperationAttemptBytecodeResolution = compilerOperationRequires( - { - canBeSkipped: true, - dataProperties: ['bytecode'], - environmentProperties: [], - operation: (identifier, data) => { - const { bytecode } = data; - if ((bytecode[identifier] as Uint8Array | undefined) !== undefined) { - return { bytecode: bytecode[identifier], status: 'success' }; - } - return { status: 'skip' }; - }, - } -); - -// eslint-disable-next-line complexity -export const compilerOperationHelperDeriveHdPrivateNode = ({ - addressIndex, - entityId, - entityHdPrivateKey, - environment, - hdKey, - identifier, -}: { - addressIndex: number; - entityId: string; - entityHdPrivateKey: string; - environment: { - ripemd160: NonNullable; - secp256k1: NonNullable; - sha256: NonNullable; - sha512: NonNullable; - }; - hdKey: AuthenticationTemplateHdKey; - identifier: string; -}): CompilerOperationResult => { - const addressOffset = - hdKey.addressOffset ?? CompilerDefaults.hdKeyAddressOffset; - const privateDerivationPath = - hdKey.privateDerivationPath ?? CompilerDefaults.hdKeyPrivateDerivationPath; - const i = addressIndex + addressOffset; - - const validPrivatePathWithIndex = /^m(?:\/(?:[0-9]+|i)'?)*$/u; - if (!validPrivatePathWithIndex.test(privateDerivationPath)) { - return { - error: `Could not generate ${identifier} – the path "${privateDerivationPath}" is not a valid "privateDerivationPath".`, - status: 'error', - }; - } - - const instancePath = privateDerivationPath.replace('i', i.toString()); - - const masterContents = decodeHdPrivateKey(environment, entityHdPrivateKey); - if (typeof masterContents === 'string') { - return { - error: `Could not generate ${identifier} – the HD private key provided for ${entityId} could not be decoded: ${masterContents}`, - status: 'error', - }; - } - - const instanceNode = deriveHdPath( - environment, - masterContents.node, - instancePath - ); - - if (typeof instanceNode === 'string') { - return { - error: `Could not generate ${identifier} – the path "${instancePath}" could not be derived for entity "${entityId}": ${instanceNode}`, - status: 'error', - }; - } - - return { - bytecode: instanceNode.privateKey, - status: 'success', - }; -}; - -export const compilerOperationHelperUnknownEntity = ( - identifier: string, - variableId: string -) => ({ - error: `Identifier "${identifier}" refers to an HdKey, but the "entityOwnership" for "${variableId}" is not available in this compilation environment.`, - status: 'error' as const, -}); - -export const compilerOperationHelperAddressIndex = (identifier: string) => ({ - error: `Identifier "${identifier}" refers to an HdKey, but "hdKeys.addressIndex" was not provided in the compilation data.`, - status: 'error' as const, -}); - -export const compilerOperationHelperDeriveHdKeyPrivate = ({ - environment, - hdKeys, - identifier, -}: { - environment: { - entityOwnership: NonNullable; - ripemd160: NonNullable; - secp256k1: NonNullable; - sha256: NonNullable; - sha512: NonNullable; - variables: NonNullable; - }; - hdKeys: NonNullable; - identifier: string; -}): CompilerOperationResult => { - const { addressIndex, hdPrivateKeys } = hdKeys; - const [variableId] = identifier.split('.'); - - const entityId = environment.entityOwnership[variableId] as - | string - | undefined; - if (entityId === undefined) { - return compilerOperationHelperUnknownEntity(identifier, variableId); - } - - if (addressIndex === undefined) { - return compilerOperationHelperAddressIndex(identifier); - } - - const entityHdPrivateKey = - hdPrivateKeys === undefined ? undefined : hdPrivateKeys[entityId]; - - if (entityHdPrivateKey === undefined) { - return { - error: `Identifier "${identifier}" refers to an HdKey owned by "${entityId}", but an HD private key for this entity (or an existing signature) was not provided in the compilation data.`, - recoverable: true, - status: 'error', - }; - } - - /** - * Guaranteed to be an `HdKey` if this method is reached in the compiler. - */ - const hdKey = environment.variables[ - variableId - ] as AuthenticationTemplateHdKey; - - return compilerOperationHelperDeriveHdPrivateNode({ - addressIndex, - entityHdPrivateKey, - entityId, - environment, - hdKey, - identifier, - }); -}; - -/** - * Returns `false` if the target script ID doesn't exist in the compilation - * environment (allows for the caller to generate the error message). - * - * If the compilation produced errors, returns a `CompilerOperationErrorFatal`. - * - * If the compilation was successful, returns the compiled bytecode as a - * `Uint8Array`. - */ -export const compilerOperationHelperCompileScript = ({ - targetScriptId, - data, - environment, -}: { - targetScriptId: string; - data: CompilationData; - environment: AnyCompilationEnvironment; -}) => { - const signingTarget = environment.scripts[targetScriptId] as - | string - | undefined; - - const compiledTarget = resolveScriptIdentifier({ - data, - environment, - identifier: targetScriptId, - }); - if (signingTarget === undefined || compiledTarget === false) { - return false; - } - if (typeof compiledTarget === 'string') { - return { - error: compiledTarget, - status: 'error', - } as CompilerOperationErrorFatal; - } - return compiledTarget.bytecode; -}; - -/** - * Returns either the properly generated `coveredBytecode` or a - * `CompilerOperationErrorFatal`. - */ -export const compilerOperationHelperGenerateCoveredBytecode = < - TransactionContext ->({ - data, - environment, - identifier, - sourceScriptIds, - unlockingScripts, -}: { - data: CompilationData; - environment: AnyCompilationEnvironment; - identifier: string; - sourceScriptIds: string[]; - unlockingScripts: { - [unlockingScriptId: string]: string; - }; -}): CompilerOperationErrorFatal | Uint8Array => { - const currentScriptId = sourceScriptIds[sourceScriptIds.length - 1] as - | string - | undefined; - if (currentScriptId === undefined) { - return { - error: `Identifier "${identifier}" requires a signing serialization, but "coveredBytecode" cannot be determined because the compilation environment's "sourceScriptIds" is empty.`, - status: 'error', - }; - } - - const targetLockingScriptId = unlockingScripts[currentScriptId] as - | string - | undefined; - if (targetLockingScriptId === undefined) { - return { - error: `Identifier "${identifier}" requires a signing serialization, but "coveredBytecode" cannot be determined because "${currentScriptId}" is not present in the compilation environment "unlockingScripts".`, - status: 'error', - }; - } - - const result = compilerOperationHelperCompileScript({ - data, - environment, - targetScriptId: targetLockingScriptId, - }); - - if (result === false) { - return { - error: `Identifier "${identifier}" requires a signing serialization which covers an unknown locking script, "${targetLockingScriptId}".`, - status: 'error', - }; - } - - return result; -}; diff --git a/src/lib/template/compiler.spec.ts b/src/lib/template/compiler.spec.ts deleted file mode 100644 index 1a47a19c..00000000 --- a/src/lib/template/compiler.spec.ts +++ /dev/null @@ -1,178 +0,0 @@ -/* eslint-disable functional/no-expression-statement, camelcase, @typescript-eslint/naming-convention */ -import test from 'ava'; - -import { - AuthenticationTemplate, - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilationEnvironment, - authenticationTemplateToCompilationEnvironmentVirtualizedTests, - createCompilerCommonSynchronous, - hexToBin, - stringify, - stringifyTestVector, -} from '../lib'; - -test('createCompilerCommonSynchronous', (t) => { - const compiler = createCompilerCommonSynchronous({ - scripts: { - lock: 'OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG', - }, - variables: { - some_public_key: { - type: 'AddressData', - }, - }, - }); - const resultLock = compiler.generateBytecode('lock', { - bytecode: { - some_public_key: hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'), - }, - }); - t.deepEqual(resultLock, { - bytecode: hexToBin('76a91415d16c84669ab46059313bf0747e781f1d13936d88ac'), - success: true, - }); -}); - -test('authenticationTemplateToCompilationEnvironment: authenticationTemplateP2pkhNonHd', (t) => { - const environment = authenticationTemplateToCompilationEnvironment( - authenticationTemplateP2pkhNonHd - ); - t.deepEqual( - environment, - { - entityOwnership: { - key: 'owner', - }, - lockingScriptTypes: { - lock: 'standard', - }, - scripts: { - lock: - 'OP_DUP\nOP_HASH160 <$( OP_HASH160\n)> OP_EQUALVERIFY\nOP_CHECKSIG', - unlock: '\n', - }, - unlockingScriptTimeLockTypes: {}, - unlockingScripts: { - unlock: 'lock', - }, - variables: { - key: { - description: 'The private key which controls this wallet.', - name: 'Key', - type: 'Key', - }, - }, - }, - stringify(environment) - ); -}); - -test('authenticationTemplateToCompilationEnvironment: authenticationTemplateP2pkh', (t) => { - const environment = authenticationTemplateToCompilationEnvironment( - authenticationTemplateP2pkh - ); - t.deepEqual( - environment, - { - entityOwnership: { - key: 'owner', - }, - lockingScriptTypes: { - lock: 'standard', - }, - scripts: { - lock: - 'OP_DUP\nOP_HASH160 <$( OP_HASH160\n)> OP_EQUALVERIFY\nOP_CHECKSIG', - unlock: '\n', - }, - unlockingScriptTimeLockTypes: {}, - unlockingScripts: { - unlock: 'lock', - }, - variables: { - key: { - description: 'The private key which controls this wallet.', - name: 'Key', - type: 'HdKey', - }, - }, - }, - stringify(environment) - ); -}); - -test('authenticationTemplateToCompilationEnvironmentVirtualizedTests', (t) => { - const environment = authenticationTemplateToCompilationEnvironmentVirtualizedTests( - { - entities: {}, - scripts: { - add_two: { - script: '<2> OP_ADD', - tests: [ - { check: '<3> OP_EQUAL', setup: '<1>' }, - { check: '<4> OP_EQUAL', setup: '<2>' }, - ], - }, - message: { - pushed: true, - script: '"abc"', - tests: [{ check: '<"abc"> OP_EQUAL' }], - }, - push_three: { - script: '<3>', - tests: [{ check: '<3> OP_EQUAL' }], - }, - unrelated: { - script: '<1>', - }, - }, - supported: ['BCH_2019_05'], - version: 0, - } as AuthenticationTemplate - ); - - t.deepEqual( - environment, - { - entityOwnership: {}, - lockingScriptTypes: {}, - scripts: { - __virtualized_test_check_add_two_0: '<3> OP_EQUAL', - __virtualized_test_check_add_two_1: '<4> OP_EQUAL', - __virtualized_test_check_message_0: '<"abc"> OP_EQUAL', - __virtualized_test_check_push_three_0: '<3> OP_EQUAL', - __virtualized_test_lock_add_two_0: - 'add_two __virtualized_test_check_add_two_0', - __virtualized_test_lock_add_two_1: - 'add_two __virtualized_test_check_add_two_1', - __virtualized_test_lock_message_0: - ' __virtualized_test_check_message_0', - __virtualized_test_lock_push_three_0: - 'push_three __virtualized_test_check_push_three_0', - __virtualized_test_unlock_add_two_0: '<1>', - __virtualized_test_unlock_add_two_1: '<2>', - __virtualized_test_unlock_message_0: '', - __virtualized_test_unlock_push_three_0: '', - add_two: '<2> OP_ADD', - message: '"abc"', - push_three: '<3>', - unrelated: '<1>', - }, - unlockingScriptTimeLockTypes: {}, - unlockingScripts: { - __virtualized_test_unlock_add_two_0: - '__virtualized_test_lock_add_two_0', - __virtualized_test_unlock_add_two_1: - '__virtualized_test_lock_add_two_1', - __virtualized_test_unlock_message_0: - '__virtualized_test_lock_message_0', - __virtualized_test_unlock_push_three_0: - '__virtualized_test_lock_push_three_0', - }, - variables: {}, - }, - stringifyTestVector(environment) - ); -}); diff --git a/src/lib/template/compiler.ts b/src/lib/template/compiler.ts deleted file mode 100644 index 4e767fdd..00000000 --- a/src/lib/template/compiler.ts +++ /dev/null @@ -1,298 +0,0 @@ -import { TransactionContextCommon } from '../transaction/transaction-types'; -import { - AuthenticationErrorCommon, - generateBytecodeMap, - OpcodesCommon, -} from '../vm/instruction-sets/instruction-sets'; -import { - AuthenticationProgramCommon, - AuthenticationProgramStateCommon, - AuthenticationProgramStateExecutionStack, - AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, -} from '../vm/vm-types'; - -import { CompilerDefaults } from './compiler-defaults'; -import { compilerOperationsCommon } from './compiler-operations'; -import { - AnyCompilationEnvironment, - BytecodeGenerationResult, - CompilationData, - CompilationEnvironment, - Compiler, -} from './compiler-types'; -import { compileScript } from './language/compile'; -import { CompilationResult } from './language/language-types'; -import { generateScenarioCommon } from './scenarios'; -import { AuthenticationTemplate } from './template-types'; - -/** - * Create a `Compiler` from the provided compilation environment. This method - * requires a full `CompilationEnvironment` and does not instantiate any new - * crypto or VM implementations. - * - * @param compilationEnvironment - the environment from which to create the - * compiler - */ -export const createCompiler = < - TransactionContext extends TransactionContextCommon, - Environment extends AnyCompilationEnvironment, - Opcodes extends number = number, - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum< - Opcodes - > = AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum ->( - compilationEnvironment: Environment -): Compiler => ({ - environment: compilationEnvironment, - generateBytecode: ( - scriptId: string, - data: CompilationData, - debug = false - ) => { - const result = compileScript( - scriptId, - data, - compilationEnvironment - ); - return (debug - ? result - : result.success - ? { bytecode: result.bytecode, success: true } - : { - errorType: result.errorType, - errors: result.errors, - success: false, - }) as Debug extends true - ? CompilationResult - : BytecodeGenerationResult; - }, - generateScenario: ({ unlockingScriptId, scenarioId }) => - generateScenarioCommon({ - environment: compilationEnvironment, - scenarioId, - unlockingScriptId, - }), -}); - -const nullHashLength = 32; - -/** - * A common `createAuthenticationProgram` implementation for most compilers. - * - * Accepts the compiled contents of an evaluation and produces a - * `AuthenticationProgramCommon` which can be evaluated to produce the resulting - * program state. - * - * The precise shape of the authentication program produced by this method is - * critical to the determinism of BTL evaluations for the compiler in which it - * is used, it therefore must be standardized between compiler implementations. - * - * @param evaluationBytecode - the compiled bytecode to incorporate in the - * created authentication program - */ -export const createAuthenticationProgramEvaluationCommon = ( - evaluationBytecode: Uint8Array -): AuthenticationProgramCommon => ({ - inputIndex: 0, - sourceOutput: { - lockingBytecode: evaluationBytecode, - satoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), - }, - spendingTransaction: { - inputs: [ - { - outpointIndex: 0, - outpointTransactionHash: new Uint8Array(nullHashLength), - sequenceNumber: 0, - unlockingBytecode: Uint8Array.of(), - }, - ], - locktime: 0, - outputs: [ - { - lockingBytecode: Uint8Array.of(), - satoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), - }, - ], - version: 0, - }, -}); - -/** - * Synchronously create a compiler using the default common environment. Because - * this compiler has no access to Secp256k1, Sha256, or a VM, it cannot compile - * evaluations or operations which require key derivation or hashing. - * - * @param scriptsAndOverrides - a compilation environment from which properties - * will be used to override properties of the default common compilation - * environment – must include the `scripts` property - */ -export const createCompilerCommonSynchronous = < - Environment extends AnyCompilationEnvironment, - ProgramState extends AuthenticationProgramStateCommon, - Opcodes extends number = OpcodesCommon, - Errors = AuthenticationErrorCommon ->( - scriptsAndOverrides: Environment -): Compiler => { - return createCompiler< - TransactionContextCommon, - Environment, - Opcodes, - ProgramState - >({ - ...{ - createAuthenticationProgram: createAuthenticationProgramEvaluationCommon, - opcodes: generateBytecodeMap(OpcodesCommon), - operations: compilerOperationsCommon, - }, - ...scriptsAndOverrides, - }); -}; - -/** - * Create a partial `CompilationEnvironment` from an `AuthenticationTemplate` by - * extracting and formatting the `scripts` and `variables` properties. - * - * Note, if this `AuthenticationTemplate` might be malformed, first validate it - * with `validateAuthenticationTemplate`. - * - * @param template - the `AuthenticationTemplate` from which to extract the - * compilation environment - */ -export const authenticationTemplateToCompilationEnvironment = ( - template: AuthenticationTemplate -): Pick< - CompilationEnvironment, - | 'entityOwnership' - | 'scenarios' - | 'scripts' - | 'variables' - | 'unlockingScripts' - | 'lockingScriptTypes' - | 'unlockingScriptTimeLockTypes' -> => { - const scripts = Object.entries(template.scripts).reduce< - CompilationEnvironment['scripts'] - >((all, [id, def]) => ({ ...all, [id]: def.script }), {}); - const variables = Object.values(template.entities).reduce< - CompilationEnvironment['variables'] - >((all, entity) => ({ ...all, ...entity.variables }), {}); - const entityOwnership = Object.entries(template.entities).reduce< - CompilationEnvironment['entityOwnership'] - >( - (all, [entityId, entity]) => ({ - ...all, - ...Object.keys(entity.variables ?? {}).reduce( - (entityVariables, variableId) => ({ - ...entityVariables, - [variableId]: entityId, - }), - {} - ), - }), - {} - ); - const unlockingScripts = Object.entries(template.scripts).reduce< - CompilationEnvironment['unlockingScripts'] - >( - (all, [id, def]) => - 'unlocks' in def && (def.unlocks as string | undefined) !== undefined - ? { ...all, [id]: def.unlocks } - : all, - {} - ); - const unlockingScriptTimeLockTypes = Object.entries(template.scripts).reduce< - CompilationEnvironment['unlockingScriptTimeLockTypes'] - >( - (all, [id, def]) => - 'timeLockType' in def && def.timeLockType !== undefined - ? { ...all, [id]: def.timeLockType } - : all, - {} - ); - const lockingScriptTypes = Object.entries(template.scripts).reduce< - CompilationEnvironment['lockingScriptTypes'] - >( - (all, [id, def]) => - 'lockingType' in def && - (def.lockingType as string | undefined) !== undefined - ? { ...all, [id]: def.lockingType } - : all, - {} - ); - const scenarios = - template.scenarios === undefined - ? undefined - : Object.entries(template.scenarios).reduce< - CompilationEnvironment['scenarios'] - >((all, [id, def]) => ({ ...all, [id]: def }), {}); - return { - entityOwnership, - lockingScriptTypes, - ...(scenarios === undefined ? {} : { scenarios }), - scripts, - unlockingScriptTimeLockTypes, - unlockingScripts, - variables, - }; -}; - -/** - * Create a partial `CompilationEnvironment` from an `AuthenticationTemplate`, - * virtualizing all script tests as unlocking and locking script pairs. - * - * @param template - the authentication template from which to extract the - * compilation environment - */ -export const authenticationTemplateToCompilationEnvironmentVirtualizedTests = ( - template: AuthenticationTemplate -): ReturnType => { - const virtualizedScripts = Object.entries(template.scripts).reduce< - typeof template.scripts - >((all, [scriptId, script]) => { - if ('tests' in script) { - return { - ...all, - ...script.tests.reduce( - (tests, test, index) => { - const pushTestedScript = script.pushed === true; - const checkScriptId = `${CompilerDefaults.virtualizedTestCheckScriptPrefix}${scriptId}_${index}`; - const virtualizedLockingScriptId = `${CompilerDefaults.virtualizedTestLockingScriptPrefix}${scriptId}_${index}`; - const virtualizedUnlockingScriptId = `${CompilerDefaults.virtualizedTestUnlockingScriptPrefix}${scriptId}_${index}`; - return { - ...tests, - [checkScriptId]: { script: test.check }, - [virtualizedLockingScriptId]: { - script: pushTestedScript - ? `<${scriptId}> ${checkScriptId}` - : `${scriptId} ${checkScriptId}`, - }, - [virtualizedUnlockingScriptId]: { - script: test.setup ?? '', - unlocks: virtualizedLockingScriptId, - }, - }; - }, - {} - ), - }; - } - return all; - }, {}); - const templateWithVirtualizedTests: AuthenticationTemplate = { - ...template, - scripts: { - ...template.scripts, - ...virtualizedScripts, - }, - }; - return authenticationTemplateToCompilationEnvironment( - templateWithVirtualizedTests - ); -}; diff --git a/src/lib/template/language/compile.ts b/src/lib/template/language/compile.ts deleted file mode 100644 index c0c04361..00000000 --- a/src/lib/template/language/compile.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { AuthenticationVirtualMachine } from '../../vm/virtual-machine'; -import { - AuthenticationProgramStateExecutionStack, - AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, -} from '../../vm/vm-types'; -import { createCompilerCommonSynchronous } from '../compiler'; -import { CompilationData, CompilationEnvironment } from '../compiler-types'; - -import { CompilationResult, CompilationResultSuccess } from './language-types'; -import { getResolutionErrors } from './language-utils'; -import { parseScript } from './parse'; -import { reduceScript } from './reduce'; -import { createIdentifierResolver, resolveScriptSegment } from './resolve'; - -/** - * A text-formatting method to pretty-print the list of expected inputs - * (`Encountered unexpected input while parsing script. Expected ...`). If - * present, the `EOF` expectation is always moved to the end of the list. - * @param expectedArray - the alphabetized list of expected inputs produced by - * `parseScript` - */ -export const describeExpectedInput = (expectedArray: string[]) => { - /** - * The constant used by the parser to denote the end of the input - */ - const EOF = 'EOF'; - const newArray = expectedArray.filter((value) => value !== EOF); - // eslint-disable-next-line functional/no-conditional-statement - if (newArray.length !== expectedArray.length) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - newArray.push('the end of the script'); - } - const withoutLastElement = newArray.slice(0, newArray.length - 1); - const lastElement = newArray[newArray.length - 1]; - const arrayRequiresCommas = 3; - const arrayRequiresOr = 2; - return `Encountered unexpected input while parsing script. Expected ${ - newArray.length >= arrayRequiresCommas - ? withoutLastElement.join(', ').concat(`, or ${lastElement}`) - : newArray.length === arrayRequiresOr - ? newArray.join(' or ') - : lastElement - }.`; -}; - -/** - * This method is generally for internal use. The `compileScript` method is the - * recommended API for direct compilation. - */ -export const compileScriptContents = < - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack = AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack, - TransactionContext = unknown ->({ - data, - environment, - script, -}: { - script: string; - data: CompilationData; - environment: CompilationEnvironment; -}): CompilationResult => { - const parseResult = parseScript(script); - if (!parseResult.status) { - return { - errorType: 'parse', - errors: [ - { - error: describeExpectedInput(parseResult.expected), - range: { - endColumn: parseResult.index.column, - endLineNumber: parseResult.index.line, - startColumn: parseResult.index.column, - startLineNumber: parseResult.index.line, - }, - }, - ], - success: false, - }; - } - const resolver = createIdentifierResolver({ data, environment }); - const resolvedScript = resolveScriptSegment(parseResult.value, resolver); - const resolutionErrors = getResolutionErrors(resolvedScript); - if (resolutionErrors.length !== 0) { - return { - errorType: 'resolve', - errors: resolutionErrors, - parse: parseResult.value, - resolve: resolvedScript, - success: false, - }; - } - const reduction = reduceScript( - resolvedScript, - environment.vm, - environment.createAuthenticationProgram - ); - return { - ...(reduction.errors === undefined - ? { bytecode: reduction.bytecode, success: true } - : { errorType: 'reduce', errors: reduction.errors, success: false }), - parse: parseResult.value, - reduce: reduction, - resolve: resolvedScript, - }; -}; - -const emptyRange = () => ({ - endColumn: 0, - endLineNumber: 0, - startColumn: 0, - startLineNumber: 0, -}); - -/** - * This method is generally for internal use. The `compileScript` method is the - * recommended API for direct compilation. - */ -export const compileScriptRaw = < - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum = AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum, - TransactionContext = unknown ->({ - data, - environment, - scriptId, -}: { - data: CompilationData; - environment: CompilationEnvironment; - scriptId: string; -}): CompilationResult => { - const script = environment.scripts[scriptId] as string | undefined; - if (script === undefined) { - return { - errorType: 'parse', - errors: [ - { - error: `No script with an ID of "${scriptId}" was provided in the compilation environment.`, - range: emptyRange(), - }, - ], - success: false, - }; - } - - if (environment.sourceScriptIds?.includes(scriptId) === true) { - return { - errorType: 'parse', - errors: [ - { - error: `A circular dependency was encountered: script "${scriptId}" relies on itself to be generated. (Source scripts: ${environment.sourceScriptIds.join( - ' → ' - )})`, - range: emptyRange(), - }, - ], - success: false, - }; - } - const sourceScriptIds = - environment.sourceScriptIds === undefined - ? [scriptId] - : [...environment.sourceScriptIds, scriptId]; - - return compileScriptContents({ - data, - environment: { ...environment, sourceScriptIds }, - script, - }); -}; - -export const compileScriptP2shLocking = ({ - lockingBytecode, - vm, -}: { - lockingBytecode: Uint8Array; - vm: - | AuthenticationVirtualMachine - | undefined; -}) => { - const compiler = createCompilerCommonSynchronous({ - scripts: { - p2shLocking: 'OP_HASH160 <$( OP_HASH160)> OP_EQUAL', - }, - variables: { lockingBytecode: { type: 'AddressData' } }, - vm, - }); - return compiler.generateBytecode('p2shLocking', { - bytecode: { lockingBytecode }, - }); -}; - -export const compileScriptP2shUnlocking = ({ - lockingBytecode, - unlockingBytecode, -}: { - lockingBytecode: Uint8Array; - unlockingBytecode: Uint8Array; -}) => { - const compiler = createCompilerCommonSynchronous({ - scripts: { - p2shUnlocking: 'unlockingBytecode ', - }, - variables: { - lockingBytecode: { type: 'AddressData' }, - unlockingBytecode: { type: 'AddressData' }, - }, - }); - return compiler.generateBytecode('p2shUnlocking', { - bytecode: { lockingBytecode, unlockingBytecode }, - }) as CompilationResultSuccess; -}; - -/** - * Parse, resolve, and reduce the selected script using the provided `data` and - * `environment`. - * - * Note, locktime validation only occurs if `transactionContext` is provided in - * the environment. - */ -// eslint-disable-next-line complexity -export const compileScript = < - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum = AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateMinimum, - TransactionContext extends { locktime: number; sequenceNumber: number } = { - locktime: number; - sequenceNumber: number; - } ->( - scriptId: string, - data: CompilationData, - environment: CompilationEnvironment -): CompilationResult => { - const locktimeDisablingSequenceNumber = 0xffffffff; - const lockTimeTypeBecomesTimestamp = 500000000; - if (data.transactionContext?.locktime !== undefined) { - if ( - environment.unlockingScriptTimeLockTypes?.[scriptId] === 'height' && - data.transactionContext.locktime >= lockTimeTypeBecomesTimestamp - ) { - return { - errorType: 'parse', - errors: [ - { - error: `The script "${scriptId}" requires a height-based locktime (less than 500,000,000), but this transaction uses a timestamp-based locktime ("${data.transactionContext.locktime}").`, - range: emptyRange(), - }, - ], - success: false, - }; - } - if ( - environment.unlockingScriptTimeLockTypes?.[scriptId] === 'timestamp' && - data.transactionContext.locktime < lockTimeTypeBecomesTimestamp - ) { - return { - errorType: 'parse', - errors: [ - { - error: `The script "${scriptId}" requires a timestamp-based locktime (greater than or equal to 500,000,000), but this transaction uses a height-based locktime ("${data.transactionContext.locktime}").`, - range: emptyRange(), - }, - ], - success: false, - }; - } - } - - if ( - data.transactionContext?.sequenceNumber !== undefined && - environment.unlockingScriptTimeLockTypes?.[scriptId] !== undefined && - data.transactionContext.sequenceNumber === locktimeDisablingSequenceNumber - ) { - return { - errorType: 'parse', - errors: [ - { - error: `The script "${scriptId}" requires a locktime, but this input's sequence number is set to disable transaction locktime (0xffffffff). This will cause the OP_CHECKLOCKTIMEVERIFY operation to error when the transaction is verified. To be valid, this input must use a sequence number which does not disable locktime.`, - range: emptyRange(), - }, - ], - success: false, - }; - } - - const rawResult = compileScriptRaw({ - data, - environment, - scriptId, - }); - - if (!rawResult.success) { - return rawResult; - } - - const unlocks = environment.unlockingScripts?.[scriptId]; - const unlockingScriptType = - unlocks === undefined - ? undefined - : environment.lockingScriptTypes?.[unlocks]; - const isP2shUnlockingScript = unlockingScriptType === 'p2sh'; - - const lockingScriptType = environment.lockingScriptTypes?.[scriptId]; - const isP2shLockingScript = lockingScriptType === 'p2sh'; - - if (isP2shLockingScript) { - const transformedResult = compileScriptP2shLocking({ - lockingBytecode: rawResult.bytecode, - vm: environment.vm, - }); - if (!transformedResult.success) { - return transformedResult; - } - return { - ...rawResult, - bytecode: transformedResult.bytecode, - transformed: 'p2sh-locking', - }; - } - - if (isP2shUnlockingScript) { - const lockingBytecodeResult = compileScriptRaw< - ProgramState, - TransactionContext - >({ - data, - environment, - scriptId: unlocks as string, - }); - if (!lockingBytecodeResult.success) { - return lockingBytecodeResult; - } - const transformedResult = compileScriptP2shUnlocking({ - lockingBytecode: lockingBytecodeResult.bytecode, - unlockingBytecode: rawResult.bytecode, - }); - return { - ...rawResult, - bytecode: transformedResult.bytecode, - transformed: 'p2sh-unlocking', - }; - } - - return rawResult; -}; diff --git a/src/lib/template/language/language-utils.spec.ts b/src/lib/template/language/language-utils.spec.ts deleted file mode 100644 index 39a949a5..00000000 --- a/src/lib/template/language/language-utils.spec.ts +++ /dev/null @@ -1,5534 +0,0 @@ -/* eslint-disable functional/no-expression-statement, max-lines */ -import test, { Macro } from 'ava'; - -import { - AuthenticationErrorBCH, - AuthenticationErrorCommon, - compileBtl, - containsRange, - createAuthenticationProgramEvaluationCommon, - createCompilerBCH, - createCompilerCommonSynchronous, - extractBytecodeResolutions, - extractEvaluationSamples, - extractEvaluationSamplesRecursive, - extractUnexecutedRanges, - hexToBin, - instantiateVirtualMachineBCH, - mergeRanges, - OpcodesCommon, - Range, - stringifyErrors, - stringifyTestVector, -} from '../../lib'; - -test('mergeRanges', (t) => { - t.deepEqual( - mergeRanges([ - { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, - { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, - ]), - { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 } - ); - t.deepEqual( - mergeRanges([ - { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, - { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, - ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } - ); - t.deepEqual( - mergeRanges([ - { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, - ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } - ); -}); - -test('containsRange', (t) => { - t.deepEqual( - containsRange( - { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, - { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 } - ), - true - ); - t.deepEqual( - containsRange( - { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, - { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 } - ), - false - ); - t.deepEqual( - containsRange( - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, - { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 } - ), - true - ); - t.deepEqual( - containsRange( - { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, - { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, - false - ), - true - ); -}); - -test('compileBtl', (t) => { - const successful = compileBtl('<0x010203>'); - t.deepEqual( - successful, - hexToBin('03010203'), - stringifyTestVector(successful) - ); - const failed = compileBtl(''); - t.deepEqual( - failed, - 'BTL compilation error: [1, 2]: Unknown identifier "bad".', - stringifyTestVector(failed) - ); -}); - -test('extractBytecodeResolutions', (t) => { - const compiler = createCompilerCommonSynchronous({ - scripts: { - pushNumbers: '<1> var', - t: - 'pushNumbers OP_ADD <0x03> OP_EQUAL <"abc"> OP_DROP <0b11> OP_EQUAL var2', - }, - variables: { var: { type: 'AddressData' }, var2: { type: 'AddressData' } }, - }); - - const compiled = compiler.generateBytecode( - 't', - { bytecode: { var: Uint8Array.of(0) } }, - true - ); - - if (!('resolve' in compiled)) { - t.fail(stringifyTestVector(compiled)); - return; - } - const result = extractBytecodeResolutions(compiled.resolve); - t.deepEqual( - result, - [ - { - bytecode: hexToBin('01'), - text: '1', - type: 'BigIntLiteral', - }, - { - bytecode: hexToBin('00'), - text: 'var', - type: 'variable', - }, - { - bytecode: hexToBin('5100'), - text: 'pushNumbers', - type: 'script', - }, - { - bytecode: hexToBin('93'), - text: 'OP_ADD', - type: 'opcode', - }, - { - bytecode: hexToBin('03'), - text: '03', - type: 'HexLiteral', - }, - { - bytecode: hexToBin('87'), - text: 'OP_EQUAL', - type: 'opcode', - }, - { - bytecode: hexToBin('616263'), - text: 'abc', - type: 'UTF8Literal', - }, - { - bytecode: hexToBin('75'), - text: 'OP_DROP', - type: 'opcode', - }, - { - bytecode: hexToBin('03'), - text: '11', - type: 'BinaryLiteral', - }, - { - bytecode: hexToBin('87'), - text: 'OP_EQUAL', - type: 'opcode', - }, - ], - stringifyTestVector(result) - ); -}); - -test('extractEvaluationSamples: empty trace', (t) => { - const result = extractEvaluationSamples({ - evaluationRange: { - endColumn: 0, - endLineNumber: 0, - startColumn: 0, - startLineNumber: 0, - }, - nodes: [], - trace: [], - }); - t.deepEqual( - result, - { - samples: [], - unmatchedStates: [], - }, - stringifyTestVector(result) - ); -}); - -const unexecutedLock = `OP_TOALTSTACK -OP_IF - <2> - OP_FROMALTSTACK - OP_IF - <3> - $( - <1> - OP_IF - <<4>> - OP_ELSE - <<5>> - OP_ENDIF - ) - 0x675667 // OP_ELSE OP_6 OP_ELSE - OP_ENDIF -OP_ELSE - <7> - OP_FROMALTSTACK - OP_IF - <$( - <7> <1> OP_ADD - )> - OP_ENDIF -OP_ENDIF`; - -const vmPromise = instantiateVirtualMachineBCH(); -const compilerPromise = createCompilerBCH({ - scripts: { - docs: '0x00 0x01 0xab01 0xcd9300 $(OP_3 <0x00> OP_SWAP OP_CAT) 0x010203', - /** - * Second node closes an open sample, then fails during an internal state. - * The sample should use the error state and the instruction which caused - * it, ignoring any later (unexecuted) instructions. - */ - error1: '0x01 $(<0xab OP_RETURN OP_0>)', - /** - * `OP_0 OP_PUSHDATA_2 600 0x62[600 times]` - fails as first instruction of - * second node: `Push exceeds the push size limit of 520 bytes.` - */ - error2: - '0x004d5802 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"', - /** - * The second node causes an error, so only two samples and no unmatched - * states are returned. - */ - error3: 'OP_0 OP_RETURN OP_0 OP_0', - nested: `OP_0 - -< - $( - 0x0000 - $($() - - OP_2 - OP_ADD - - ) - $( <"abc"> - ) - OP_CAT - OP_CAT - ) - $( - <0> - <0> - $()) ->`, - nonPushingOpcodeUnlock: 'OP_1 OP_DUP', - unexecuted00: `<0> <0> ${unexecutedLock}`, - unexecuted01: `<0> <1> ${unexecutedLock}`, - unexecuted10: `<1> <0> ${unexecutedLock}`, - unexecuted11: `<1> <1> ${unexecutedLock}`, - unexecutedEmpty: ``, - }, -}); - -test('extractEvaluationSamples: documentation example', async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('docs', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const actualTrace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); - /** - * We double the debugging trace just to test that the extra states are - * returned in `unmatchedStates`. - */ - const trace = [...actualTrace, ...actualTrace]; - const extracted = extractEvaluationSamples({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: Uint8Array.of(0), - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: Uint8Array.of(0x01), - range: { - endColumn: 10, - endLineNumber: 1, - startColumn: 6, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('ab01'), - range: { - endColumn: 17, - endLineNumber: 1, - startColumn: 11, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('cd9300'), - range: { - endColumn: 26, - endLineNumber: 1, - startColumn: 18, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('0003'), - range: { - endColumn: 56, - endLineNumber: 1, - startColumn: 27, - startLineNumber: 1, - }, - source: { - bytecode: hexToBin('5301007c7e'), - range: { - endColumn: 55, - endLineNumber: 1, - startColumn: 29, - startLineNumber: 1, - }, - script: [ - { - bytecode: hexToBin('53'), - range: { - endColumn: 33, - endLineNumber: 1, - startColumn: 29, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('0100'), - push: { - bytecode: hexToBin('00'), - range: { - endColumn: 39, - endLineNumber: 1, - startColumn: 35, - startLineNumber: 1, - }, - script: [ - { - bytecode: hexToBin('00'), - range: { - endColumn: 39, - endLineNumber: 1, - startColumn: 35, - startLineNumber: 1, - }, - }, - ], - }, - range: { - endColumn: 40, - endLineNumber: 1, - startColumn: 34, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('7c'), - range: { - endColumn: 48, - endLineNumber: 1, - startColumn: 41, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('7e'), - range: { - endColumn: 55, - endLineNumber: 1, - startColumn: 49, - startLineNumber: 1, - }, - }, - ], - }, - - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('03')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('03'), Uint8Array.of(0)], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0), hexToBin('03')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 4, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 2, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('0003')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 83, - }, - { - data: Uint8Array.of(0), - opcode: 1, - }, - { - opcode: 124, - }, - { - opcode: 126, - }, - ], - ip: 4, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 2, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('0003')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - { - bytecode: hexToBin('010203'), - range: { - endColumn: 65, - endLineNumber: 1, - startColumn: 57, - startLineNumber: 1, - }, - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - traceWithUnlockingPhaseAndFinalState, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('ab')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('ab'), hexToBin('cd')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 4, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('f8')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 5, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('f8'), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 6, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('f8'), hexToBin(''), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 7, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [ - hexToBin(''), - hexToBin('f8'), - hexToBin(''), - hexToBin(''), - hexToBin('010203'), - ], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('ab'), - opcode: 1, - }, - { - data: hexToBin('cd'), - opcode: 1, - }, - { - opcode: 147, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('010203'), - opcode: 3, - }, - ], - ip: 7, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [ - hexToBin(''), - hexToBin('f8'), - hexToBin(''), - hexToBin(''), - hexToBin('010203'), - ], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) - ); - - t.deepEqual(extracted, { - samples: [ - { - evaluationRange, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: trace[0], - }, - { - evaluationRange, - instruction: { data: Uint8Array.of(), opcode: 0 }, - internalStates: [], - range: nodes[0].range, - state: trace[1], - }, - { - evaluationRange, - instruction: { data: hexToBin('ab'), opcode: 1 }, - internalStates: [], - range: mergeRanges([nodes[1].range, nodes[2].range]), - state: trace[2], - }, - { - evaluationRange, - instruction: { data: hexToBin('cd'), opcode: 1 }, - internalStates: [], - range: mergeRanges([nodes[2].range, nodes[3].range]), - state: trace[3], - }, - { - evaluationRange, - instruction: { data: Uint8Array.of(), opcode: 0 }, - internalStates: [ - { - instruction: { opcode: 0x93 }, - state: trace[4], - }, - ], - range: nodes[3].range, - state: trace[5], - }, - { - evaluationRange, - instruction: { data: Uint8Array.of(), opcode: 0 }, - internalStates: [], - range: nodes[4].range, - state: trace[6], - }, - { - evaluationRange, - instruction: { data: hexToBin('010203'), opcode: 3 }, - internalStates: [], - range: mergeRanges([nodes[4].range, nodes[5].range]), - state: trace[7], - }, - ], - unmatchedStates: actualTrace, - }); -}); - -test('extractEvaluationSamples: error in initial validation', async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('nonPushingOpcodeUnlock', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const nullHashLength = 32; - const testProgram = { - inputIndex: 0, - sourceOutput: { - lockingBytecode: Uint8Array.of(OpcodesCommon.OP_1), - satoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), - }, - spendingTransaction: { - inputs: [ - { - outpointIndex: 0, - outpointTransactionHash: new Uint8Array(nullHashLength), - sequenceNumber: 0, - unlockingBytecode: result.bytecode, - }, - ], - locktime: 0, - outputs: [ - { - lockingBytecode: Uint8Array.of(), - satoshis: Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), - }, - ], - version: 0, - }, - }; - - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const trace = vm.debug(testProgram); - const extracted = extractEvaluationSamples({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: hexToBin('51'), - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('76'), - range: { - endColumn: 12, - endLineNumber: 1, - startColumn: 6, - startLineNumber: 1, - }, - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - trace, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: 'Unlocking bytecode may contain only push operations.' as AuthenticationErrorBCH.requiresPushOnly, - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 118, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(trace) - ); - - t.deepEqual(extracted, { - samples: [ - { - evaluationRange, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: trace[0], - }, - ], - unmatchedStates: [], - }); -}); - -test("extractEvaluationSamples: node closes an open sample, then errors before the node's last instruction", async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('error1', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const trace = traceWithUnlockingPhaseAndFinalState.slice(1); - const extracted = extractEvaluationSamples({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: hexToBin('01'), - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('ab6a00'), - range: { - endColumn: 30, - endLineNumber: 1, - startColumn: 6, - startLineNumber: 1, - }, - source: { - bytecode: hexToBin('03ab6a00'), - range: { - endColumn: 29, - endLineNumber: 1, - startColumn: 8, - startLineNumber: 1, - }, - script: [ - { - bytecode: hexToBin('03ab6a00'), - push: { - bytecode: hexToBin('ab6a00'), - range: { - endColumn: 28, - endLineNumber: 1, - startColumn: 9, - startLineNumber: 1, - }, - script: [ - { - bytecode: hexToBin('ab'), - range: { - endColumn: 13, - endLineNumber: 1, - startColumn: 9, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('6a'), - range: { - endColumn: 23, - endLineNumber: 1, - startColumn: 14, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('00'), - range: { - endColumn: 28, - endLineNumber: 1, - startColumn: 24, - startLineNumber: 1, - }, - }, - ], - }, - range: { - endColumn: 29, - endLineNumber: 1, - startColumn: 8, - startLineNumber: 1, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('ab6a00'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('ab6a00'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('ab6a00')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('ab6a00'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('ab6a00')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - traceWithUnlockingPhaseAndFinalState, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('ab'), - opcode: 1, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('ab'), - opcode: 1, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('ab')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: AuthenticationErrorCommon.calledReturn, - executionStack: [], - instructions: [ - { - data: hexToBin('ab'), - opcode: 1, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('ab')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: AuthenticationErrorCommon.calledReturn, - executionStack: [], - instructions: [ - { - data: hexToBin('ab'), - opcode: 1, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('ab')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) - ); - - t.deepEqual( - extracted, - { - samples: [ - { - evaluationRange, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: trace[0], - }, - { - evaluationRange, - instruction: { data: hexToBin('ab'), opcode: 1 }, - internalStates: [], - range: mergeRanges([nodes[0].range, nodes[1].range]), - state: trace[1], - }, - { - evaluationRange, - instruction: { opcode: OpcodesCommon.OP_RETURN }, - internalStates: [], - range: nodes[1].range, - state: trace[2], - }, - ], - unmatchedStates: [], - }, - stringifyTestVector(extracted) - ); -}); - -test('extractEvaluationSamples: node which closes an open sample with an error', async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('error2', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const trace = traceWithUnlockingPhaseAndFinalState.slice(1); - const extracted = extractEvaluationSamples({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: hexToBin('004d5802'), - range: { - endColumn: 11, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - range: { - endColumn: 614, - endLineNumber: 1, - startColumn: 12, - startLineNumber: 1, - }, - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - traceWithUnlockingPhaseAndFinalState, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - opcode: 77, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - opcode: 77, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: AuthenticationErrorCommon.exceedsMaximumPush, - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - opcode: 77, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: AuthenticationErrorCommon.exceedsMaximumPush, - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - opcode: 77, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) - ); - - t.deepEqual(extracted, { - samples: [ - { - evaluationRange, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: trace[0], - }, - { - evaluationRange, - instruction: { data: Uint8Array.of(), opcode: 0 }, - internalStates: [], - range: nodes[0].range, - state: trace[1], - }, - { - evaluationRange, - instruction: { - data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' - ), - opcode: 77, - }, - internalStates: [], - range: mergeRanges([nodes[0].range, nodes[1].range]), - state: trace[2], - }, - ], - unmatchedStates: [trace[3]], - }); -}); - -test('extractEvaluationSamples: error3 – error occurs, so final state is dropped', async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('error3', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const trace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); - const extracted = extractEvaluationSamples({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: hexToBin('00'), - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('6a'), - range: { - endColumn: 15, - endLineNumber: 1, - startColumn: 6, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('00'), - range: { - endColumn: 20, - endLineNumber: 1, - startColumn: 16, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('00'), - range: { - endColumn: 25, - endLineNumber: 1, - startColumn: 21, - startLineNumber: 1, - }, - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - traceWithUnlockingPhaseAndFinalState, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: 'Program called an OP_RETURN operation.' as AuthenticationErrorCommon, - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - error: 'Program called an OP_RETURN operation.' as AuthenticationErrorCommon, - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 106, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) - ); - - t.deepEqual( - extracted, - { - samples: [ - { - evaluationRange, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: trace[0], - }, - { - evaluationRange, - instruction: { data: Uint8Array.of(), opcode: 0 }, - internalStates: [], - range: nodes[0].range, - state: trace[1], - }, - ], - unmatchedStates: [], - }, - stringifyTestVector(extracted) - ); -}); - -test('extractEvaluationSamplesRecursive: complex, deeply-nested script with irregular spacing', async (t) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode('nested', {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const trace = traceWithUnlockingPhaseAndFinalState.slice(1); - const sampleResult = extractEvaluationSamplesRecursive({ - evaluationRange, - nodes, - trace, - }); - t.deepEqual( - nodes, - [ - { - bytecode: hexToBin('00'), - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - }, - { - bytecode: hexToBin('03616263'), - push: { - bytecode: hexToBin('616263'), - range: { - endColumn: 15, - endLineNumber: 20, - startColumn: 3, - startLineNumber: 4, - }, - script: [ - { - bytecode: hexToBin('616263'), - range: { - endColumn: 4, - endLineNumber: 16, - startColumn: 3, - startLineNumber: 4, - }, - source: { - bytecode: hexToBin('0000036162637e7e'), - range: { - endColumn: 9, - endLineNumber: 15, - startColumn: 3, - startLineNumber: 5, - }, - script: [ - { - bytecode: hexToBin('0000'), - range: { - endColumn: 9, - endLineNumber: 5, - startColumn: 3, - startLineNumber: 5, - }, - }, - { - bytecode: hexToBin('03'), - range: { - endColumn: 6, - endLineNumber: 11, - startColumn: 5, - startLineNumber: 6, - }, - source: { - bytecode: hexToBin('515293'), - range: { - endColumn: 13, - endLineNumber: 9, - startColumn: 7, - startLineNumber: 6, - }, - script: [ - { - bytecode: hexToBin('51'), - range: { - endColumn: 16, - endLineNumber: 6, - startColumn: 7, - startLineNumber: 6, - }, - source: { - bytecode: hexToBin('0151'), - range: { - endColumn: 15, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - script: [ - { - bytecode: hexToBin('0151'), - push: { - bytecode: hexToBin('51'), - range: { - endColumn: 14, - endLineNumber: 6, - startColumn: 10, - startLineNumber: 6, - }, - script: [ - { - bytecode: hexToBin('51'), - range: { - endColumn: 14, - endLineNumber: 6, - startColumn: 10, - startLineNumber: 6, - }, - }, - ], - }, - range: { - endColumn: 15, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin( - '000000000000000000' - ), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin( - '000000000000000000' - ), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin( - '000000000000000000' - ), - executionStack: [], - instructions: [ - { - data: hexToBin('51'), - opcode: 1, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin( - '000000000000000000' - ), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin( - '000000000000000000' - ), - executionStack: [], - instructions: [ - { - data: hexToBin('51'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('51')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin( - '000000000000000000' - ), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin( - '000000000000000000' - ), - executionStack: [], - instructions: [ - { - data: hexToBin('51'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('51')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin( - '000000000000000000' - ), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - { - bytecode: hexToBin('52'), - range: { - endColumn: 11, - endLineNumber: 8, - startColumn: 7, - startLineNumber: 8, - }, - }, - { - bytecode: hexToBin('93'), - range: { - endColumn: 13, - endLineNumber: 9, - startColumn: 7, - startLineNumber: 9, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('01')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('01'), hexToBin('02')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('03')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('03')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - { - bytecode: hexToBin('616263'), - range: { - endColumn: 6, - endLineNumber: 13, - startColumn: 5, - startLineNumber: 12, - }, - source: { - bytecode: hexToBin('03616263'), - range: { - endColumn: 15, - endLineNumber: 12, - startColumn: 8, - startLineNumber: 12, - }, - script: [ - { - bytecode: hexToBin('03616263'), - push: { - bytecode: hexToBin('616263'), - range: { - endColumn: 14, - endLineNumber: 12, - startColumn: 9, - startLineNumber: 12, - }, - script: [ - { - bytecode: hexToBin('616263'), - range: { - endColumn: 14, - endLineNumber: 12, - startColumn: 9, - startLineNumber: 12, - }, - }, - ], - }, - range: { - endColumn: 15, - endLineNumber: 12, - startColumn: 8, - startLineNumber: 12, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - { - bytecode: hexToBin('7e'), - range: { - endColumn: 9, - endLineNumber: 14, - startColumn: 3, - startLineNumber: 14, - }, - }, - { - bytecode: hexToBin('7e'), - range: { - endColumn: 9, - endLineNumber: 15, - startColumn: 3, - startLineNumber: 15, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 4, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 5, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 2, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 5, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 2, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - { - bytecode: hexToBin(''), - range: { - endColumn: 15, - endLineNumber: 20, - startColumn: 3, - startLineNumber: 17, - }, - source: { - bytecode: hexToBin('00007e'), - range: { - endColumn: 14, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 18, - }, - script: [ - { - bytecode: hexToBin('00'), - push: { - bytecode: hexToBin(''), - range: { - endColumn: 7, - endLineNumber: 18, - startColumn: 6, - startLineNumber: 18, - }, - script: [ - { - bytecode: hexToBin(''), - range: { - endColumn: 7, - endLineNumber: 18, - startColumn: 6, - startLineNumber: 18, - }, - }, - ], - }, - range: { - endColumn: 8, - endLineNumber: 18, - startColumn: 5, - startLineNumber: 18, - }, - }, - { - bytecode: hexToBin('00'), - push: { - bytecode: hexToBin(''), - range: { - endColumn: 7, - endLineNumber: 19, - startColumn: 6, - startLineNumber: 19, - }, - script: [ - { - bytecode: hexToBin(''), - range: { - endColumn: 7, - endLineNumber: 19, - startColumn: 6, - startLineNumber: 19, - }, - }, - ], - }, - range: { - endColumn: 8, - endLineNumber: 19, - startColumn: 5, - startLineNumber: 19, - }, - }, - { - bytecode: hexToBin('7e'), - range: { - endColumn: 14, - endLineNumber: 20, - startColumn: 3, - startLineNumber: 20, - }, - source: { - bytecode: hexToBin('017e'), - range: { - endColumn: 13, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - script: [ - { - bytecode: hexToBin('017e'), - push: { - bytecode: hexToBin('7e'), - range: { - endColumn: 12, - endLineNumber: 20, - startColumn: 6, - startLineNumber: 20, - }, - script: [ - { - bytecode: hexToBin('7e'), - range: { - endColumn: 12, - endLineNumber: 20, - startColumn: 6, - startLineNumber: 20, - }, - }, - ], - }, - range: { - endColumn: 13, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('7e'), - opcode: 1, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('7e'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('7e')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('7e'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('7e')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - ], - }, - trace: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - ], - }, - range: { - endColumn: 2, - endLineNumber: 21, - startColumn: 1, - startLineNumber: 3, - }, - }, - ], - stringifyTestVector(nodes) - ); - - t.deepEqual( - traceWithUnlockingPhaseAndFinalState, - [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) - ); - - t.deepEqual( - sampleResult, - { - samples: [ - { - evaluationRange: { - endColumn: 2, - endLineNumber: 21, - startColumn: 1, - startLineNumber: 1, - }, - internalStates: [], - range: { - endColumn: 1, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 2, - endLineNumber: 21, - startColumn: 1, - startLineNumber: 1, - }, - instruction: { - data: hexToBin(''), - opcode: 0, - }, - internalStates: [], - range: { - endColumn: 5, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 3, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 4, - }, - internalStates: [], - range: { - endColumn: 5, - endLineNumber: 4, - startColumn: 5, - startLineNumber: 4, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 3, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 4, - }, - instruction: { - data: hexToBin(''), - opcode: 0, - }, - internalStates: [ - { - instruction: { - data: hexToBin(''), - opcode: 0, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - ], - range: { - endColumn: 9, - endLineNumber: 5, - startColumn: 3, - startLineNumber: 5, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 11, - startColumn: 7, - startLineNumber: 6, - }, - internalStates: [], - range: { - endColumn: 7, - endLineNumber: 6, - startColumn: 7, - startLineNumber: 6, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 15, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - internalStates: [], - range: { - endColumn: 9, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('51'), - opcode: 1, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 15, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - instruction: { - data: hexToBin('51'), - opcode: 1, - }, - internalStates: [], - range: { - endColumn: 15, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('51'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('51')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 11, - startColumn: 7, - startLineNumber: 6, - }, - instruction: { - opcode: 81, - }, - internalStates: [], - range: { - endColumn: 16, - endLineNumber: 6, - startColumn: 7, - startLineNumber: 6, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('01')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 11, - startColumn: 7, - startLineNumber: 6, - }, - instruction: { - opcode: 82, - }, - internalStates: [], - range: { - endColumn: 11, - endLineNumber: 8, - startColumn: 7, - startLineNumber: 8, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('01'), hexToBin('02')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 11, - startColumn: 7, - startLineNumber: 6, - }, - instruction: { - opcode: 147, - }, - internalStates: [], - range: { - endColumn: 13, - endLineNumber: 9, - startColumn: 7, - startLineNumber: 9, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 81, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('03')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 13, - startColumn: 7, - startLineNumber: 12, - }, - internalStates: [], - range: { - endColumn: 7, - endLineNumber: 12, - startColumn: 7, - startLineNumber: 12, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 5, - endLineNumber: 13, - startColumn: 7, - startLineNumber: 12, - }, - instruction: { - data: hexToBin('616263'), - opcode: 3, - }, - internalStates: [], - range: { - endColumn: 15, - endLineNumber: 12, - startColumn: 8, - startLineNumber: 12, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 3, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 4, - }, - instruction: { - data: hexToBin('616263'), - opcode: 3, - }, - internalStates: [], - range: { - endColumn: 6, - endLineNumber: 13, - startColumn: 5, - startLineNumber: 6, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 3, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 4, - }, - instruction: { - opcode: 126, - }, - internalStates: [], - range: { - endColumn: 9, - endLineNumber: 14, - startColumn: 3, - startLineNumber: 14, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 4, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 3, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 4, - }, - instruction: { - opcode: 126, - }, - internalStates: [], - range: { - endColumn: 9, - endLineNumber: 15, - startColumn: 3, - startLineNumber: 15, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - { - opcode: 126, - }, - { - opcode: 126, - }, - ], - ip: 5, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 2, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 14, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 17, - }, - internalStates: [], - range: { - endColumn: 5, - endLineNumber: 17, - startColumn: 5, - startLineNumber: 17, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 14, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 17, - }, - instruction: { - data: hexToBin(''), - opcode: 0, - }, - internalStates: [], - range: { - endColumn: 8, - endLineNumber: 18, - startColumn: 5, - startLineNumber: 18, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 14, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 17, - }, - instruction: { - data: hexToBin(''), - opcode: 0, - }, - internalStates: [], - range: { - endColumn: 8, - endLineNumber: 19, - startColumn: 5, - startLineNumber: 19, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 13, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - internalStates: [], - range: { - endColumn: 5, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('7e'), - opcode: 1, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 13, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - instruction: { - data: hexToBin('7e'), - opcode: 1, - }, - internalStates: [], - range: { - endColumn: 13, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin('7e'), - opcode: 1, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('7e')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 14, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 17, - }, - instruction: { - opcode: 126, - }, - internalStates: [], - range: { - endColumn: 14, - endLineNumber: 20, - startColumn: 3, - startLineNumber: 20, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin(''), - opcode: 0, - }, - { - opcode: 126, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin('')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - { - evaluationRange: { - endColumn: 2, - endLineNumber: 21, - startColumn: 1, - startLineNumber: 1, - }, - instruction: { - data: hexToBin('616263'), - opcode: 3, - }, - internalStates: [], - range: { - endColumn: 2, - endLineNumber: 21, - startColumn: 1, - startLineNumber: 3, - }, - state: { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - }, - ], - unmatchedStates: [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - data: hexToBin(''), - opcode: 0, - }, - { - data: hexToBin('616263'), - opcode: 3, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [hexToBin(''), hexToBin('616263')], - transactionOutpoints: hexToBin( - '000000000000000000000000000000000000000000000000000000000000000000000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('00000000'), - version: 0, - }, - ], - }, - stringifyTestVector(sampleResult) - ); -}); - -const extractUnexecutedRangesMacro: Macro<[string, Range[], boolean?]> = async ( - t, - scriptId, - ranges, - specifyStart - // eslint-disable-next-line max-params -) => { - const compiler = await compilerPromise; - const vm = await vmPromise; - const result = compiler.generateBytecode(scriptId, {}, true); - if (!result.success) { - t.fail(stringifyErrors(result.errors)); - return; - } - const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode - ); - const nodes = result.reduce.script; - const evaluationRange = result.reduce.range; - const traceWithUnlockingPhaseAndFinalState = vm.debug(testProgram); - const trace = traceWithUnlockingPhaseAndFinalState.slice(1, -1); - const { samples } = extractEvaluationSamplesRecursive({ - evaluationRange, - nodes, - trace, - }); - const unexecutedRanges = extractUnexecutedRanges( - samples, - specifyStart === undefined ? undefined : '1,1' - ); - t.deepEqual(unexecutedRanges, ranges, stringifyTestVector(unexecutedRanges)); -}; - -// eslint-disable-next-line functional/immutable-data -extractUnexecutedRangesMacro.title = (_, scriptId) => - `extractUnexecutedRangesMacro: ${scriptId}`; - -test( - extractUnexecutedRangesMacro, - 'unexecuted00', - [ - { - endColumn: 8, - endLineNumber: 3, - startColumn: 5, - startLineNumber: 3, - }, - { - endColumn: 20, - endLineNumber: 4, - startColumn: 5, - startLineNumber: 4, - }, - { - endColumn: 10, - endLineNumber: 5, - startColumn: 5, - startLineNumber: 5, - }, - { - endColumn: 12, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - { - endColumn: 10, - endLineNumber: 14, - startColumn: 9, - startLineNumber: 7, - }, - { - endColumn: 13, - endLineNumber: 15, - startColumn: 5, - startLineNumber: 15, - }, - { - endColumn: 13, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 16, - }, - { - endColumn: 11, - endLineNumber: 23, - startColumn: 9, - startLineNumber: 21, - }, - ], - true -); - -test(extractUnexecutedRangesMacro, 'unexecuted01', [ - { - endColumn: 8, - endLineNumber: 3, - startColumn: 5, - startLineNumber: 3, - }, - { - endColumn: 20, - endLineNumber: 4, - startColumn: 5, - startLineNumber: 4, - }, - { - endColumn: 10, - endLineNumber: 5, - startColumn: 5, - startLineNumber: 5, - }, - { - endColumn: 12, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - { - endColumn: 10, - endLineNumber: 14, - startColumn: 9, - startLineNumber: 7, - }, - { - endColumn: 13, - endLineNumber: 15, - startColumn: 5, - startLineNumber: 15, - }, - { - endColumn: 13, - endLineNumber: 16, - startColumn: 5, - startLineNumber: 16, - }, -]); - -test(extractUnexecutedRangesMacro, 'unexecuted10', [ - { - endColumn: 12, - endLineNumber: 6, - startColumn: 9, - startLineNumber: 6, - }, - { - endColumn: 10, - endLineNumber: 14, - startColumn: 9, - startLineNumber: 7, - }, - { - endColumn: 8, - endLineNumber: 18, - startColumn: 5, - startLineNumber: 18, - }, - { - endColumn: 20, - endLineNumber: 19, - startColumn: 5, - startLineNumber: 19, - }, - { - endColumn: 10, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - { - endColumn: 11, - endLineNumber: 23, - startColumn: 9, - startLineNumber: 21, - }, - { - endColumn: 13, - endLineNumber: 24, - startColumn: 5, - startLineNumber: 24, - }, -]); - -test(extractUnexecutedRangesMacro, 'unexecuted11', [ - { - endColumn: 22, - endLineNumber: 12, - startColumn: 17, - startLineNumber: 12, - }, - { - endColumn: 8, - endLineNumber: 18, - startColumn: 5, - startLineNumber: 18, - }, - { - endColumn: 20, - endLineNumber: 19, - startColumn: 5, - startLineNumber: 19, - }, - { - endColumn: 10, - endLineNumber: 20, - startColumn: 5, - startLineNumber: 20, - }, - { - endColumn: 11, - endLineNumber: 23, - startColumn: 9, - startLineNumber: 21, - }, - { - endColumn: 13, - endLineNumber: 24, - startColumn: 5, - startLineNumber: 24, - }, -]); - -test(extractUnexecutedRangesMacro, 'unexecutedEmpty', []); diff --git a/src/lib/template/language/language.ts b/src/lib/template/language/language.ts deleted file mode 100644 index bd946f31..00000000 --- a/src/lib/template/language/language.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './compile'; -export * from './language-utils'; -export * from './language-types'; -export * from './parse'; -export * from './reduce'; -export * from './resolve'; diff --git a/src/lib/template/scenarios.ts b/src/lib/template/scenarios.ts deleted file mode 100644 index f3057c04..00000000 --- a/src/lib/template/scenarios.ts +++ /dev/null @@ -1,731 +0,0 @@ -import { binToHex, hexToBin } from '../format/hex'; -import { - bigIntToBinUint256BEClamped, - bigIntToBinUint64LE, -} from '../format/numbers'; -import { deriveHdPrivateNodeFromSeed, encodeHdPrivateKey } from '../key/hd-key'; -import { - Output, - TransactionContextCommon, -} from '../transaction/transaction-types'; - -import { CompilerDefaults } from './compiler-defaults'; -import { - AnyCompilationEnvironmentIgnoreOperations, - CompilationData, - Scenario, -} from './compiler-types'; -import { compileScript, compileScriptRaw } from './language/compile'; -import { CompilationError } from './language/language-types'; -import { stringifyErrors } from './language/language-utils'; -import { - AuthenticationTemplateKey, - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioData, - AuthenticationTemplateScenarioOutput, -} from './template-types'; - -/** - * The contents of an `AuthenticationTemplateScenario` without the `name` and - * `description`. - */ -export type ScenarioDefinition = Pick< - AuthenticationTemplateScenario, - 'data' | 'transaction' | 'value' ->; - -type RequiredTwoLevels = { - [P in keyof T]-?: Required; -}; - -/** - * All scenarios extend the default scenario, so the `data`, `transaction` (and - * all `transaction` properties), and `value` properties are guaranteed to be - * defined in an extended scenario definition. - */ -export type ExtendedScenarioDefinition = Required< - Pick -> & - RequiredTwoLevels> & - Required>; - -/* - * & { - * value: Uint8Array; - * }; - */ - -/** - * Given a compilation environment, generate the default scenario which is - * extended by all the environments scenarios. - * - * For details on default scenario generation, see - * `AuthenticationTemplateScenario.extends`. - * - * @param environment - the compilation environment from which to generate the - * default scenario - */ -// eslint-disable-next-line complexity -export const generateDefaultScenarioDefinition = < - Environment extends AnyCompilationEnvironmentIgnoreOperations< - TransactionContext - >, - TransactionContext ->( - environment: Environment -): string | ExtendedScenarioDefinition => { - const { variables, entityOwnership } = environment; - - const keyVariableIds = - variables === undefined - ? [] - : Object.entries(variables) - .filter( - (entry): entry is [string, AuthenticationTemplateKey] => - entry[1].type === 'Key' - ) - .map(([id]) => id); - - const entityIds = - entityOwnership === undefined - ? [] - : Object.keys( - Object.values(entityOwnership).reduce( - (all, entityId) => ({ ...all, [entityId]: true }), - {} - ) - ); - - const valueMap = [...keyVariableIds, ...entityIds] - .sort(([idA], [idB]) => idA.localeCompare(idB)) - .reduce<{ [variableOrEntityId: string]: Uint8Array }>( - (all, id, index) => ({ - ...all, - [id]: bigIntToBinUint256BEClamped(BigInt(index + 1)), - }), - {} - ); - - const privateKeys = - variables === undefined - ? undefined - : Object.entries(variables).reduce<{ [id: string]: string }>( - (all, [variableId, variable]) => - variable.type === 'Key' - ? { - ...all, - [variableId]: binToHex(valueMap[variableId]), - } - : all, - {} - ); - - const defaultScenario: ExtendedScenarioDefinition = { - data: { - currentBlockHeight: CompilerDefaults.defaultScenarioCurrentBlockHeight as const, - currentBlockTime: CompilerDefaults.defaultScenarioCurrentBlockTime as const, - ...(privateKeys === undefined || Object.keys(privateKeys).length === 0 - ? {} - : { keys: { privateKeys } }), - }, - transaction: { - inputs: [{ unlockingBytecode: null }], - locktime: CompilerDefaults.defaultScenarioTransactionLocktime as const, - outputs: [ - { - lockingBytecode: CompilerDefaults.defaultScenarioTransactionOutputsLockingBytecodeHex as const, - }, - ], - version: CompilerDefaults.defaultScenarioTransactionVersion as const, - }, - value: CompilerDefaults.defaultScenarioValue as const, - }; - - const hasHdKeys = - variables === undefined - ? false - : Object.values(variables).findIndex( - (variable) => variable.type === 'HdKey' - ) !== -1; - - if (!hasHdKeys) { - return defaultScenario; - } - - const { sha256, sha512 } = environment; - if (sha256 === undefined) { - return 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compilation environment.'; - } - if (sha512 === undefined) { - return 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compilation environment.'; - } - const crypto = { sha256, sha512 }; - - const hdPrivateKeys = entityIds.reduce((all, entityId) => { - /** - * The first 5,000,000,000 seeds have been tested, scenarios are - * unlikely to exceed this number of entities. - */ - const assumeValid = true; - const masterNode = deriveHdPrivateNodeFromSeed( - crypto, - valueMap[entityId], - assumeValid - ); - const hdPrivateKey = encodeHdPrivateKey(crypto, { - network: 'mainnet', - node: masterNode, - }); - - return { ...all, [entityId]: hdPrivateKey }; - }, {}); - - return { - ...defaultScenario, - data: { - ...defaultScenario.data, - hdKeys: { - addressIndex: CompilerDefaults.defaultScenarioAddressIndex as const, - hdPrivateKeys, - }, - }, - }; -}; - -/** - * Extend the `data` property of a scenario definition with values from a parent - * scenario definition. Returns the extended value for `data`. - * - * @param parentData - the scenario `data` which is extended by the child - * scenario - * @param childData - the scenario `data` which may override values from the - * parent scenario - */ -// eslint-disable-next-line complexity -export const extendScenarioDefinitionData = ( - parentData: NonNullable, - childData: NonNullable -) => { - return { - ...parentData, - ...childData, - ...(parentData.bytecode === undefined && childData.bytecode === undefined - ? {} - : { - bytecode: { - ...parentData.bytecode, - ...childData.bytecode, - }, - }), - ...(parentData.hdKeys === undefined && childData.hdKeys === undefined - ? {} - : { - hdKeys: { - ...parentData.hdKeys, - ...childData.hdKeys, - ...(parentData.hdKeys?.hdPrivateKeys === undefined && - childData.hdKeys?.hdPrivateKeys === undefined - ? {} - : { - hdPrivateKeys: { - ...parentData.hdKeys?.hdPrivateKeys, - ...childData.hdKeys?.hdPrivateKeys, - }, - }), - ...(parentData.hdKeys?.hdPublicKeys === undefined && - childData.hdKeys?.hdPublicKeys === undefined - ? {} - : { - hdPublicKeys: { - ...parentData.hdKeys?.hdPublicKeys, - ...childData.hdKeys?.hdPublicKeys, - }, - }), - }, - }), - ...(parentData.keys === undefined && childData.keys === undefined - ? {} - : { - keys: { - privateKeys: { - ...parentData.keys?.privateKeys, - ...childData.keys?.privateKeys, - }, - }, - }), - }; -}; - -/** - * Extend a child scenario definition with values from a parent scenario - * definition. Returns the extended values for `data`, `transaction`, and - * `value`. - * - * @param parentScenario - the scenario which is extended by the child scenario - * @param childScenario - the scenario which may override values from the parent - * scenario - */ -// eslint-disable-next-line complexity -export const extendScenarioDefinition = < - ParentScenarioType extends AuthenticationTemplateScenario ->( - parentScenario: ParentScenarioType, - childScenario: AuthenticationTemplateScenario -) => { - return { - ...(parentScenario.data === undefined && childScenario.data === undefined - ? {} - : { - data: extendScenarioDefinitionData( - parentScenario.data ?? {}, - childScenario.data ?? {} - ), - }), - ...(parentScenario.transaction === undefined && - childScenario.transaction === undefined - ? {} - : { - transaction: { - ...parentScenario.transaction, - ...childScenario.transaction, - }, - }), - ...(parentScenario.value === undefined && childScenario.value === undefined - ? {} - : { value: childScenario.value ?? parentScenario.value }), - } as ParentScenarioType extends ExtendedScenarioDefinition - ? ExtendedScenarioDefinition - : ScenarioDefinition; -}; - -/** - * Generate the full scenario which is extended by the provided scenario - * identifier. Scenarios for which `extends` is `undefined` extend the default - * scenario for the provided compilation environment. - * - * @param scenarioId - the identifier of the scenario for from which to select - * the extended scenario - * @param environment - the compilation environment from which to generate the - * extended scenario - * @param sourceScenarioIds - an array of scenario identifiers indicating the - * path taken to arrive at the current scenario - used to detect and prevent - * cycles in extending scenarios (defaults to `[]`) - */ -// eslint-disable-next-line complexity -export const generateExtendedScenario = < - Environment extends AnyCompilationEnvironmentIgnoreOperations< - TransactionContext - >, - TransactionContext ->({ - environment, - scenarioId, - sourceScenarioIds = [], -}: { - environment: Environment; - scenarioId?: string; - sourceScenarioIds?: string[]; -}): string | ExtendedScenarioDefinition => { - if (scenarioId === undefined) { - return generateDefaultScenarioDefinition( - environment - ); - } - - if (sourceScenarioIds.includes(scenarioId)) { - return `Cannot extend scenario "${scenarioId}": scenario "${scenarioId}" extends itself. Scenario inheritance path: ${sourceScenarioIds.join( - ' → ' - )}`; - } - const scenario = environment.scenarios?.[scenarioId]; - if (scenario === undefined) { - return `Cannot extend scenario "${scenarioId}": a scenario with the identifier ${scenarioId} is not included in this compilation environment.`; - } - const parentScenario = - scenario.extends === undefined - ? generateDefaultScenarioDefinition( - environment - ) - : generateExtendedScenario({ - environment, - scenarioId: scenario.extends, - sourceScenarioIds: [...sourceScenarioIds, scenarioId], - }); - if (typeof parentScenario === 'string') { - return parentScenario; - } - - return extendScenarioDefinition(parentScenario, scenario); -}; - -/** - * Derive standard `CompilationData` properties from an extended scenario - * definition. - * @param definition - a scenario definition which has been extended by the - * default scenario definition - */ -// eslint-disable-next-line complexity -export const extendedScenarioDefinitionToCompilationData = ( - definition: ScenarioDefinition & Required> -): CompilationData => ({ - ...(definition.data.currentBlockHeight === undefined - ? {} - : { - currentBlockHeight: definition.data.currentBlockHeight, - }), - ...(definition.data.currentBlockTime === undefined - ? {} - : { - currentBlockTime: definition.data.currentBlockTime, - }), - ...(definition.data.hdKeys === undefined - ? {} - : { - hdKeys: { - ...(definition.data.hdKeys.addressIndex === undefined - ? {} - : { - addressIndex: definition.data.hdKeys.addressIndex, - }), - ...(definition.data.hdKeys.hdPrivateKeys !== undefined && - Object.keys(definition.data.hdKeys.hdPrivateKeys).length > 0 - ? { - hdPrivateKeys: definition.data.hdKeys.hdPrivateKeys, - } - : {}), - ...(definition.data.hdKeys.hdPublicKeys === undefined - ? {} - : { - hdPublicKeys: definition.data.hdKeys.hdPublicKeys, - }), - }, - }), - ...(definition.data.keys?.privateKeys !== undefined && - Object.keys(definition.data.keys.privateKeys).length > 0 - ? { - keys: { - privateKeys: Object.entries(definition.data.keys.privateKeys).reduce( - (all, [id, hex]) => ({ ...all, [id]: hexToBin(hex) }), - {} - ), - }, - } - : {}), -}); - -/** - * Extend a `CompilationData` object with the compiled result of the bytecode - * scripts provided by a `AuthenticationTemplateScenarioData`. - * - * @param compilationData - the compilation data to extend - * @param environment - the compilation environment in which to compile the - * scripts - * @param scenarioDataBytecodeScripts - the `data.bytecode` property of an - * `AuthenticationTemplateScenarioData` - */ -export const extendCompilationDataWithScenarioBytecode = < - Environment extends AnyCompilationEnvironmentIgnoreOperations< - TransactionContext - >, - TransactionContext ->({ - compilationData, - environment, - scenarioDataBytecodeScripts, -}: { - compilationData: CompilationData; - environment: Environment; - scenarioDataBytecodeScripts: NonNullable< - AuthenticationTemplateScenarioData['bytecode'] - >; -}) => { - const prefixBytecodeScriptId = (id: string) => - `${CompilerDefaults.scenarioBytecodeScriptPrefix}${id}`; - const bytecodeScripts = Object.entries(scenarioDataBytecodeScripts).reduce<{ - [bytecodeScriptIdentifier: string]: string; - }>((all, [id, script]) => { - return { - ...all, - [prefixBytecodeScriptId(id)]: script, - }; - }, {}); - - const bytecodeScriptExtendedEnvironment: Environment = { - ...environment, - scripts: { - ...environment.scripts, - ...bytecodeScripts, - }, - }; - - const bytecodeCompilations: ( - | { - bytecode: Uint8Array; - id: string; - } - | { - errors: [CompilationError] | CompilationError[]; - id: string; - } - )[] = Object.keys(scenarioDataBytecodeScripts).map((id) => { - const result = compileScriptRaw({ - data: compilationData, - environment: bytecodeScriptExtendedEnvironment, - scriptId: prefixBytecodeScriptId(id), - }); - if (result.success) { - return { - bytecode: result.bytecode, - id, - }; - } - return { - errors: result.errors, - id, - }; - }); - - const failedResults = bytecodeCompilations.filter( - ( - result - ): result is { - errors: [CompilationError] | CompilationError[]; - id: string; - } => 'errors' in result - ); - if (failedResults.length > 0) { - return `${failedResults - .map( - (result) => - `Compilation error while generating bytecode for "${ - result.id - }": ${stringifyErrors(result.errors)}` - ) - .join('; ')}`; - } - - const compiledBytecode = (bytecodeCompilations as { - bytecode: Uint8Array; - id: string; - }[]).reduce<{ - [fullIdentifier: string]: Uint8Array; - }>((all, result) => ({ ...all, [result.id]: result.bytecode }), {}); - - return { - ...(Object.keys(compiledBytecode).length > 0 - ? { bytecode: compiledBytecode } - : {}), - ...compilationData, - } as CompilationData; -}; - -/** - * The default `lockingBytecode` value for scenario outputs is a new empty - * object (`{}`). - */ -const getScenarioOutputDefaultLockingBytecode = () => ({}); - -/** - * Generate a scenario given a compilation environment. If neither `scenarioId` - * or `unlockingScriptId` are provided, the default scenario for the compilation - * environment will be generated. - * - * Returns either the full `CompilationData` for the selected scenario or an - * error message (as a `string`). - * - * @param scenarioId - the ID of the scenario to generate – if `undefined`, the - * default scenario - * @param unlockingScriptId - the ID of the unlocking script under test by this - * scenario – if `undefined` but required by the scenario, an error will be - * produced - * @param environment - the compilation environment from which to generate the - * scenario - */ -// eslint-disable-next-line complexity -export const generateScenarioCommon = < - Environment extends AnyCompilationEnvironmentIgnoreOperations ->({ - environment, - scenarioId, - unlockingScriptId, -}: { - environment: Environment; - scenarioId?: string; - unlockingScriptId?: string; -}): Scenario | string => { - const { scenario, scenarioName } = - scenarioId === undefined - ? { scenario: {}, scenarioName: `the default scenario` } - : { - scenario: environment.scenarios?.[scenarioId], - scenarioName: `scenario "${scenarioId}"`, - }; - - if (scenario === undefined) { - return `Cannot generate ${scenarioName}: a scenario with the identifier ${ - scenarioId as string - } is not included in this compilation environment.`; - } - - const parentScenario = generateExtendedScenario< - Environment, - TransactionContextCommon - >({ environment, scenarioId }); - if (typeof parentScenario === 'string') { - return `Cannot generate ${scenarioName}: ${parentScenario}`; - } - - const extendedScenario = extendScenarioDefinition(parentScenario, scenario); - const partialCompilationData = extendedScenarioDefinitionToCompilationData( - extendedScenario - ); - const fullCompilationData = extendCompilationDataWithScenarioBytecode({ - compilationData: partialCompilationData, - environment, - scenarioDataBytecodeScripts: extendedScenario.data.bytecode ?? {}, - }); - - if (typeof fullCompilationData === 'string') { - return `Cannot generate ${scenarioName}: ${fullCompilationData}`; - } - - const testedInputs = extendedScenario.transaction.inputs.filter( - (input) => input.unlockingBytecode === null - ); - if (testedInputs.length !== 1) { - return `Cannot generate ${scenarioName}: the specific input under test in this scenario is ambiguous – "transaction.inputs" must include exactly one input which has "unlockingBytecode" set to "null".`; - } - const testedInputIndex = extendedScenario.transaction.inputs.findIndex( - (input) => input.unlockingBytecode === null - ); - - const outputs = extendedScenario.transaction.outputs.map< - Required - >((output) => ({ - lockingBytecode: - output.lockingBytecode ?? getScenarioOutputDefaultLockingBytecode(), - satoshis: output.satoshis ?? CompilerDefaults.defaultScenarioOutputSatoshis, - })); - - const compiledOutputResults = outputs.map( - // eslint-disable-next-line complexity - (output, index) => { - const satoshis = - typeof output.satoshis === 'string' - ? hexToBin(output.satoshis) - : bigIntToBinUint64LE(BigInt(output.satoshis)); - if (typeof output.lockingBytecode === 'string') { - return { - lockingBytecode: hexToBin(output.lockingBytecode), - satoshis, - }; - } - - const specifiedLockingScriptId = output.lockingBytecode.script; - const impliedLockingScriptId = - unlockingScriptId === undefined - ? undefined - : environment.unlockingScripts?.[unlockingScriptId]; - const scriptId = - typeof specifiedLockingScriptId === 'string' - ? specifiedLockingScriptId - : impliedLockingScriptId; - - if (scriptId === undefined) { - if (unlockingScriptId === undefined) { - return `Cannot generate locking bytecode for output ${index}: this output is set to use the script unlocked by the unlocking script under test, but an unlocking script ID was not provided for scenario generation.`; - } - return `Cannot generate locking bytecode for output ${index}: the locking script unlocked by "${unlockingScriptId}" is not provided in this compilation environment.`; - } - - const overriddenDataDefinition = - output.lockingBytecode.overrides === undefined - ? undefined - : extendScenarioDefinitionData( - extendedScenario.data, - output.lockingBytecode.overrides - ); - - const overriddenCompilationData = - overriddenDataDefinition === undefined - ? undefined - : extendCompilationDataWithScenarioBytecode({ - compilationData: extendedScenarioDefinitionToCompilationData({ - data: overriddenDataDefinition, - }), - environment, - scenarioDataBytecodeScripts: - overriddenDataDefinition.bytecode ?? {}, - }); - - if (typeof overriddenCompilationData === 'string') { - return `Cannot generate locking bytecode for output ${index}: ${overriddenCompilationData}`; - } - - const data = - overriddenCompilationData === undefined - ? fullCompilationData - : overriddenCompilationData; - - const result = compileScript(scriptId, data, environment); - - if (!result.success) { - return `Cannot generate locking bytecode for output ${index}: ${stringifyErrors( - result.errors - )}`; - } - - return { lockingBytecode: result.bytecode, satoshis }; - } - ); - - const outputCompilationErrors = compiledOutputResults.filter( - (result): result is string => typeof result === 'string' - ); - if (outputCompilationErrors.length > 0) { - return `Cannot generate ${scenarioName}: ${outputCompilationErrors.join( - '; ' - )}`; - } - const compiledOutputs = compiledOutputResults as Output[]; - - const sourceSatoshis = - typeof extendedScenario.value === 'number' - ? bigIntToBinUint64LE(BigInt(extendedScenario.value)) - : hexToBin(extendedScenario.value); - - const unlockingBytecodeUnderTest = undefined; - return { - data: fullCompilationData, - program: { - inputIndex: testedInputIndex, - sourceOutput: { satoshis: sourceSatoshis }, - spendingTransaction: { - // eslint-disable-next-line complexity - inputs: extendedScenario.transaction.inputs.map((input) => ({ - outpointIndex: - input.outpointIndex ?? - CompilerDefaults.defaultScenarioInputOutpointIndex, - outpointTransactionHash: hexToBin( - input.outpointTransactionHash ?? - CompilerDefaults.defaultScenarioInputOutpointTransactionHash - ), - sequenceNumber: - input.sequenceNumber ?? - CompilerDefaults.defaultScenarioInputSequenceNumber, - unlockingBytecode: - input.unlockingBytecode === null - ? unlockingBytecodeUnderTest - : hexToBin( - typeof input.unlockingBytecode === 'string' - ? input.unlockingBytecode - : CompilerDefaults.defaultScenarioInputUnlockingBytecodeHex - ), - })), - locktime: extendedScenario.transaction.locktime, - outputs: compiledOutputs, - version: extendedScenario.transaction.version, - }, - }, - }; -}; diff --git a/src/lib/template/standard/standard.ts b/src/lib/template/standard/standard.ts deleted file mode 100644 index 11535bbf..00000000 --- a/src/lib/template/standard/standard.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './p2pkh'; diff --git a/src/lib/template/template-validation.ts b/src/lib/template/template-validation.ts deleted file mode 100644 index 338e6911..00000000 --- a/src/lib/template/template-validation.ts +++ /dev/null @@ -1,1646 +0,0 @@ -/* eslint-disable max-lines, @typescript-eslint/ban-types */ -import { hexToBin } from '../format/hex'; -import { validateSecp256k1PrivateKey } from '../key/key-utils'; - -import { CompilerDefaults } from './compiler-defaults'; -import { BuiltInVariables } from './language/resolve'; -import { - AuthenticationTemplate, - AuthenticationTemplateAddressData, - AuthenticationTemplateEntity, - AuthenticationTemplateHdKey, - AuthenticationTemplateKey, - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioData, - AuthenticationTemplateScenarioInput, - AuthenticationTemplateScenarioOutput, - AuthenticationTemplateScript, - AuthenticationTemplateScriptLocking, - AuthenticationTemplateScriptTest, - AuthenticationTemplateScriptTested, - AuthenticationTemplateScriptUnlocking, - AuthenticationTemplateVariable, - AuthenticationTemplateWalletData, - AuthenticationVirtualMachineIdentifier, -} from './template-types'; - -const listIds = (ids: string[]) => - ids - .map((id) => `"${id}"`) - .sort((a, b) => a.localeCompare(b)) - .join(', '); - -/** - * Verify that the provided value is an array which is not sparse. - */ -const isDenseArray = (maybeArray: unknown): maybeArray is unknown[] => - Array.isArray(maybeArray) && !maybeArray.includes(undefined); - -/** - * Check that a value is an array which contains only strings and has no empty - * items (is not a sparse array, e.g. `[1, , 3]`). - */ -const isStringArray = (maybeArray: unknown): maybeArray is string[] => - isDenseArray(maybeArray) && - !maybeArray.some((item) => typeof item !== 'string'); - -const isObject = (maybeObject: unknown): maybeObject is object => - typeof maybeObject === 'object' && maybeObject !== null; - -const isStringObject = ( - maybeStringObject: object -): maybeStringObject is { [key: string]: string } => - !Object.values(maybeStringObject).some((value) => typeof value !== 'string'); - -const hasNonHexCharacter = /[^a-fA-F0-9]/u; -const isHexString = (maybeHexString: unknown): maybeHexString is string => - typeof maybeHexString === 'string' && - !hasNonHexCharacter.test(maybeHexString); - -const characterLength32BytePrivateKey = 64; -const isObjectOfValidPrivateKeys = ( - maybePrivateKeysObject: object -): maybePrivateKeysObject is { [key: string]: string } => - !Object.values(maybePrivateKeysObject).some( - (value) => - !isHexString(value) || - value.length !== characterLength32BytePrivateKey || - !validateSecp256k1PrivateKey(hexToBin(value)) - ); - -const isInteger = (value: unknown): value is number => - typeof value === 'number' && Number.isInteger(value); - -const isPositiveInteger = (value: unknown): value is number => - isInteger(value) && value >= 0; - -const isRangedInteger = ( - value: unknown, - minimum: number, - maximum: number -): value is number => isInteger(value) && value >= minimum && value <= maximum; - -/** - * Verify that a value is a valid `satoshi` value: either a number between `0` - * and `Number.MAX_SAFE_INTEGER` or a 16-character, hexadecimal-encoded string. - * - * @param maybeSatoshis - the value to verify - */ -const isValidSatoshisValue = ( - maybeSatoshis: unknown -): maybeSatoshis is number | string | undefined => { - const uint64HexLength = 16; - if ( - maybeSatoshis === undefined || - isRangedInteger(maybeSatoshis, 0, Number.MAX_SAFE_INTEGER) || - (isHexString(maybeSatoshis) && maybeSatoshis.length === uint64HexLength) - ) { - return true; - } - return false; -}; - -/** - * Parse an authentication template `scripts` object into its component scripts, - * validating the shape of each script object. Returns either an error message - * as a string or an object of cloned and sorted scripts. - * - * @param scripts - the `scripts` property of an `AuthenticationTemplate` - */ -// eslint-disable-next-line complexity -export const parseAuthenticationTemplateScripts = (scripts: object) => { - const unknownScripts = Object.entries(scripts).map<{ - id: string; - script: unknown; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - }>(([id, script]) => ({ id, script })); - - const nonObjectScripts = unknownScripts - .filter(({ script }) => typeof script !== 'object' || script === null) - .map(({ id }) => id); - if (nonObjectScripts.length > 0) { - return `All authentication template scripts must be objects, but the following scripts are not objects: ${listIds( - nonObjectScripts - )}.`; - } - const allScripts = unknownScripts as { id: string; script: object }[]; - - const unlockingResults: ( - | { id: string; script: AuthenticationTemplateScriptUnlocking } - | string - )[] = allScripts - .filter(({ script }) => 'unlocks' in script) - // eslint-disable-next-line complexity - .map(({ id, script }) => { - const { - ageLock, - estimate, - fails, - invalid, - name, - passes, - script: scriptContents, - timeLockType, - unlocks, - } = script as { - ageLock: unknown; - estimate: unknown; - fails: unknown; - invalid: unknown; - name: unknown; - passes: unknown; - script: unknown; - timeLockType: unknown; - unlocks: unknown; - }; - if (typeof unlocks !== 'string') { - return `The "unlocks" property of unlocking script "${id}" must be a string.`; - } - if (typeof scriptContents !== 'string') { - return `The "script" property of unlocking script "${id}" must be a string.`; - } - - if (ageLock !== undefined && typeof ageLock !== 'string') { - return `If defined, the "ageLock" property of unlocking script "${id}" must be a string.`; - } - - if (estimate !== undefined && typeof estimate !== 'string') { - return `If defined, the "estimate" property of unlocking script "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of unlocking script "${id}" must be a string.`; - } - - if (fails !== undefined && !isStringArray(fails)) { - return `If defined, the "fails" property of unlocking script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - if (invalid !== undefined && !isStringArray(invalid)) { - return `If defined, the "invalid" property of unlocking script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - if (passes !== undefined && !isStringArray(passes)) { - return `If defined, the "passes" property of unlocking script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - if ( - timeLockType !== undefined && - timeLockType !== ('timestamp' as const) && - timeLockType !== ('height' as const) - ) { - return `If defined, the "timeLockType" property of unlocking script "${id}" must be either "timestamp" or "height".`; - } - return { - id, - script: { - ...(ageLock === undefined ? {} : { ageLock }), - ...(estimate === undefined ? {} : { estimate }), - ...(fails === undefined ? {} : { fails }), - ...(invalid === undefined ? {} : { invalid }), - ...(passes === undefined ? {} : { passes }), - ...(name === undefined ? {} : { name }), - script: scriptContents, - ...(timeLockType === undefined ? {} : { timeLockType }), - unlocks, - }, - }; - }); - - const invalidUnlockingResults = unlockingResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidUnlockingResults.length > 0) { - return invalidUnlockingResults.join(' '); - } - const validUnlockingResults = unlockingResults as { - id: string; - script: AuthenticationTemplateScriptUnlocking; - }[]; - const unlocking = validUnlockingResults.reduce<{ - [id: string]: AuthenticationTemplateScriptUnlocking; - }>((all, result) => ({ ...all, [result.id]: result.script }), {}); - const unlockingIds = validUnlockingResults.map(({ id }) => id); - const impliedLockingIds = validUnlockingResults.map( - ({ script }) => script.unlocks - ); - - const lockingResults: ( - | { id: string; script: AuthenticationTemplateScriptLocking } - | string - )[] = allScripts - .filter( - ({ id, script }) => - 'lockingType' in script || impliedLockingIds.includes(id) - ) - // eslint-disable-next-line complexity - .map(({ id, script }) => { - const { lockingType, script: scriptContents, name } = script as { - name: unknown; - script: unknown; - lockingType: unknown; - }; - - if (lockingType !== 'standard' && lockingType !== 'p2sh') { - return `The "lockingType" property of locking script "${id}" must be either "standard" or "p2sh".`; - } - if (typeof scriptContents !== 'string') { - return `The "script" property of locking script "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of locking script "${id}" must be a string.`; - } - - return { - id, - script: { - lockingType, - ...(name === undefined ? {} : { name }), - script: scriptContents, - }, - }; - }); - - const invalidLockingResults = lockingResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidLockingResults.length > 0) { - return invalidLockingResults.join(' '); - } - const validLockingResults = lockingResults as { - id: string; - script: AuthenticationTemplateScriptLocking; - }[]; - const locking = validLockingResults.reduce<{ - [id: string]: AuthenticationTemplateScriptLocking; - }>((all, result) => ({ ...all, [result.id]: result.script }), {}); - const lockingIds = validLockingResults.map(({ id }) => id); - - const unknownLockingIds = Object.values(unlocking) - .map((script) => script.unlocks) - .filter((unlocks) => !lockingIds.includes(unlocks)); - - if (unknownLockingIds.length > 0) { - return `The following locking scripts (referenced in "unlocks" properties) were not provided: ${listIds( - unknownLockingIds - )}.`; - } - - const testedResults: ( - | { id: string; script: AuthenticationTemplateScriptTested } - | string - )[] = allScripts - .filter(({ script }) => 'tests' in script) - // eslint-disable-next-line complexity - .map(({ id, script }) => { - const { tests, script: scriptContents, name, pushed } = script as { - name: unknown; - script: unknown; - tests: unknown; - pushed: unknown; - }; - - if (typeof scriptContents !== 'string') { - return `The "script" property of tested script "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of tested script "${id}" must be a string.`; - } - - if (pushed !== undefined && pushed !== true && pushed !== false) { - return `If defined, the "pushed" property of tested script "${id}" must be a boolean value.`; - } - - if (!Array.isArray(tests)) { - return `If defined, the "tests" property of tested script "${id}" must be an array.`; - } - - const extractedTests = - // eslint-disable-next-line complexity - tests.map((test) => { - const { - check, - fails, - invalid, - name: testName, - passes, - setup, - } = test as { - check: unknown; - fails: unknown; - invalid: unknown; - name: unknown; - passes: unknown; - setup: unknown; - }; - if (typeof check !== 'string') { - return `The "check" properties of all tests in tested script "${id}" must be a strings.`; - } - - if (testName !== undefined && typeof testName !== 'string') { - return `If defined, the "name" properties of all tests in tested script "${id}" must be strings.`; - } - - if (setup !== undefined && typeof setup !== 'string') { - return `If defined, the "setup" properties of all tests in tested script "${id}" must be strings.`; - } - - if (fails !== undefined && !isStringArray(fails)) { - return `If defined, the "fails" property of each test in tested script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - if (invalid !== undefined && !isStringArray(invalid)) { - return `If defined, the "invalid" property of each test in tested script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - if (passes !== undefined && !isStringArray(passes)) { - return `If defined, the "passes" property of each test in tested script "${id}" must be an array containing only scenario identifiers (strings).`; - } - - return { - check, - ...(fails === undefined ? {} : { fails }), - ...(invalid === undefined ? {} : { invalid }), - ...(passes === undefined ? {} : { passes }), - ...(testName === undefined ? {} : { name: testName }), - ...(setup === undefined ? {} : { setup }), - }; - }); - - const invalidTests = extractedTests.filter( - (result): result is string => typeof result === 'string' - ); - - if (invalidTests.length > 0) { - return invalidTests.join(' '); - } - - const validTests = extractedTests as AuthenticationTemplateScriptTest[]; - - return { - id, - script: { - ...(name === undefined ? {} : { name }), - ...(pushed === undefined ? {} : { pushed }), - script: scriptContents, - tests: validTests, - }, - }; - }); - - const invalidTestedResults = testedResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidTestedResults.length > 0) { - return invalidTestedResults.join(' '); - } - const validTestedResults = testedResults as { - id: string; - script: AuthenticationTemplateScriptTested; - }[]; - const tested = validTestedResults.reduce<{ - [id: string]: AuthenticationTemplateScriptTested; - }>((all, result) => ({ ...all, [result.id]: result.script }), {}); - - const testedIds = validTestedResults.map(({ id }) => id); - const lockingAndUnlockingIds = [...lockingIds, ...unlockingIds]; - - const lockingAndUnlockingIdsWithTests = lockingAndUnlockingIds.filter((id) => - testedIds.includes(id) - ); - - if (lockingAndUnlockingIdsWithTests.length > 0) { - return `Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: ${listIds( - lockingAndUnlockingIdsWithTests - )}`; - } - - const alreadySortedIds = [...lockingAndUnlockingIds, testedIds]; - - const otherResults: ( - | { id: string; script: AuthenticationTemplateScript } - | string - )[] = allScripts - .filter(({ id }) => !alreadySortedIds.includes(id)) - .map(({ id, script }) => { - const { script: scriptContents, name } = script as { - name: unknown; - script: unknown; - timeLockType: unknown; - unlocks: unknown; - }; - if (typeof scriptContents !== 'string') { - return `The "script" property of script "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of script "${id}" must be a string.`; - } - - return { - id, - script: { - ...(name === undefined ? {} : { name }), - script: scriptContents, - }, - }; - }); - - const invalidOtherResults = otherResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidOtherResults.length > 0) { - return invalidOtherResults.join(' '); - } - const validOtherResults = otherResults as { - id: string; - script: AuthenticationTemplateScript; - }[]; - const other = validOtherResults.reduce<{ - [id: string]: AuthenticationTemplateScript; - }>((all, result) => ({ ...all, [result.id]: result.script }), {}); - - return { - locking, - other, - tested, - unlocking, - }; -}; - -const authenticationTemplateVariableTypes = [ - 'AddressData', - 'HdKey', - 'Key', - 'WalletData', -] as AuthenticationTemplateVariable['type'][]; - -const isAuthenticationTemplateVariableType = ( - type: unknown -): type is AuthenticationTemplateVariable['type'] => - authenticationTemplateVariableTypes.includes( - type as AuthenticationTemplateVariable['type'] - ); - -/** - * Parse an authentication template entity `variables` object into its component - * variables, validating the shape of each variable object. Returns either an - * error message as a string or the cloned variables object. - * - * @param scripts - the `scripts` property of an `AuthenticationTemplate` - */ -export const parseAuthenticationTemplateVariable = ( - variables: object, - entityId: string -) => { - const unknownVariables = Object.entries(variables).map<{ - id: string; - variable: unknown; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - }>(([id, variable]) => ({ id, variable })); - - const nonObjectVariables = unknownVariables - .filter(({ variable }) => typeof variable !== 'object' || variable === null) - .map(({ id }) => id); - if (nonObjectVariables.length > 0) { - return `All authentication template variables must be objects, but the following variables owned by entity "${entityId}" are not objects: ${listIds( - nonObjectVariables - )}.`; - } - const allEntities = unknownVariables as { id: string; variable: object }[]; - - const variableResults: ( - | { id: string; variable: AuthenticationTemplateVariable } - | string - )[] = allEntities - // eslint-disable-next-line complexity - .map(({ id, variable }) => { - const { description, name, type } = variable as { - description: unknown; - name: unknown; - type: unknown; - }; - - if (!isAuthenticationTemplateVariableType(type)) { - return `The "type" property of variable "${id}" must be a valid authentication template variable type. Available types are: ${listIds( - authenticationTemplateVariableTypes - )}.`; - } - - if (description !== undefined && typeof description !== 'string') { - return `If defined, the "description" property of variable "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of variable "${id}" must be a string.`; - } - - if (type === 'HdKey') { - const { - addressOffset, - hdPublicKeyDerivationPath, - privateDerivationPath, - publicDerivationPath, - } = variable as { - addressOffset: unknown; - hdPublicKeyDerivationPath: unknown; - privateDerivationPath: unknown; - publicDerivationPath: unknown; - }; - - if (addressOffset !== undefined && typeof addressOffset !== 'number') { - return `If defined, the "addressOffset" property of HdKey "${id}" must be a number.`; - } - - if ( - hdPublicKeyDerivationPath !== undefined && - typeof hdPublicKeyDerivationPath !== 'string' - ) { - return `If defined, the "hdPublicKeyDerivationPath" property of HdKey "${id}" must be a string.`; - } - - if ( - privateDerivationPath !== undefined && - typeof privateDerivationPath !== 'string' - ) { - return `If defined, the "privateDerivationPath" property of HdKey "${id}" must be a string.`; - } - - if ( - publicDerivationPath !== undefined && - typeof publicDerivationPath !== 'string' - ) { - return `If defined, the "publicDerivationPath" property of HdKey "${id}" must be a string.`; - } - - const hdPublicKeyPath = - hdPublicKeyDerivationPath ?? - CompilerDefaults.hdKeyHdPublicKeyDerivationPath; - const privatePath = - privateDerivationPath ?? CompilerDefaults.hdKeyPrivateDerivationPath; - const publicPath = - publicDerivationPath ?? privatePath.replace('m', 'M'); - - const validPrivatePathWithIndex = /^m(?:\/(?:[0-9]+|i)'?)*$/u; - const validPrivatePath = /^m(?:\/[0-9]+'?)*$/u; - const replacedPrivatePath = privatePath.replace('i', '0'); - if ( - !validPrivatePathWithIndex.test(privatePath) && - !validPrivatePath.test(replacedPrivatePath) - ) { - return `If defined, the "privateDerivationPath" property of HdKey "${id}" must be a valid private derivation path, but the provided value is "${hdPublicKeyPath}". A valid path must begin with "m" and include only "/", "'", a single "i" address index character, and numbers.`; - } - if (!validPrivatePath.test(hdPublicKeyPath)) { - return `If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey's HD public node, but the provided value for HdKey "${id}" is "${hdPublicKeyPath}". A valid path must begin with "m" and include only "/", "'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").`; - } - const validPublicPathWithIndex = /^M(?:\/(?:[0-9]+|i))*$/u; - const validPublicPath = /^M(?:\/[0-9]+)*$/u; - const replacedPublicPath = publicPath.replace('i', '0'); - if ( - !validPublicPathWithIndex.test(publicPath) && - !validPublicPath.test(replacedPublicPath) - ) { - return `The "publicDerivationPath" property of HdKey "${id}" must be a valid public derivation path, but the current value is "${publicPath}". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".`; - } - const publicPathSuffix = publicPath.replace('M/', ''); - const impliedPrivatePath = `${hdPublicKeyPath}/${publicPathSuffix}`; - if (impliedPrivatePath !== privatePath) { - return `The "privateDerivationPath" property of HdKey "${id}" is "${privatePath}", but the implied private derivation path of "hdPublicKeyDerivationPath" and "publicDerivationPath" is "${impliedPrivatePath}". The "publicDerivationPath" property must be set to allow for public derivation of the same HD node derived by "privateDerivationPath" beginning from the HD public key derived at "hdPublicKeyDerivationPath".`; - } - - return { - id, - variable: { - ...(addressOffset === undefined ? {} : { addressOffset }), - ...(description === undefined ? {} : { description }), - ...(hdPublicKeyDerivationPath === undefined - ? {} - : { hdPublicKeyDerivationPath }), - ...(name === undefined ? {} : { name }), - ...(privateDerivationPath === undefined - ? {} - : { privateDerivationPath }), - ...(publicDerivationPath === undefined - ? {} - : { publicDerivationPath }), - type, - } as AuthenticationTemplateHdKey, - }; - } - - return { - id, - variable: { - ...(description === undefined ? {} : { description }), - ...(name === undefined ? {} : { name }), - type, - } as - | AuthenticationTemplateWalletData - | AuthenticationTemplateAddressData - | AuthenticationTemplateKey, - }; - }); - - const invalidVariableResults = variableResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidVariableResults.length > 0) { - return invalidVariableResults.join(' '); - } - const validVariableResults = (variableResults as unknown) as { - id: string; - variable: AuthenticationTemplateVariable; - }[]; - const clonedVariables = validVariableResults.reduce<{ - [id: string]: AuthenticationTemplateVariable; - }>((all, result) => ({ ...all, [result.id]: result.variable }), {}); - - return clonedVariables; -}; - -/** - * Parse an authentication template `entities` object into its component - * entities, validating the shape of each entity object. Returns either an error - * message as a string or the cloned entities object. - * - * @param scripts - the `scripts` property of an `AuthenticationTemplate` - */ -export const parseAuthenticationTemplateEntities = (entities: object) => { - const unknownEntities = Object.entries(entities).map<{ - id: string; - entity: unknown; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - }>(([id, entity]) => ({ entity, id })); - - const nonObjectEntities = unknownEntities - .filter(({ entity }) => typeof entity !== 'object' || entity === null) - .map(({ id }) => id); - if (nonObjectEntities.length > 0) { - return `All authentication template entities must be objects, but the following entities are not objects: ${listIds( - nonObjectEntities - )}.`; - } - const allEntities = unknownEntities as { id: string; entity: object }[]; - - const entityResults: ( - | { id: string; entity: AuthenticationTemplateEntity } - | string - )[] = allEntities - // eslint-disable-next-line complexity - .map(({ id, entity }) => { - const { description, name, scripts, variables } = entity as { - description: unknown; - name: unknown; - scripts: unknown; - variables: unknown; - }; - if (description !== undefined && typeof description !== 'string') { - return `If defined, the "description" property of entity "${id}" must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of entity "${id}" must be a string.`; - } - - if (scripts !== undefined && !isStringArray(scripts)) { - return `If defined, the "scripts" property of entity "${id}" must be an array containing only script identifiers (strings).`; - } - - if (variables !== undefined && !isObject(variables)) { - return `If defined, the "variables" property of entity "${id}" must be an object.`; - } - - const variableResult = - variables === undefined - ? undefined - : parseAuthenticationTemplateVariable(variables, id); - - if (typeof variableResult === 'string') { - return variableResult; - } - - return { - entity: { - ...(description === undefined ? {} : { description }), - ...(name === undefined ? {} : { name }), - ...(scripts === undefined ? {} : { scripts }), - ...(variableResult === undefined - ? {} - : { variables: variableResult }), - }, - id, - }; - }); - - const invalidEntityResults = entityResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidEntityResults.length > 0) { - return invalidEntityResults.join(' '); - } - const validEntityResults = entityResults as { - id: string; - entity: AuthenticationTemplateEntity; - }[]; - const clonedEntities = validEntityResults.reduce<{ - [id: string]: AuthenticationTemplateEntity; - }>((all, result) => ({ ...all, [result.id]: result.entity }), {}); - - return clonedEntities; -}; - -/** - * Validate and clone an Authentication Template Scenario `data.hdKeys` object. - * - * @param hdKeys - the `data.hdKeys` object to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `scenario "test"` or - * `'lockingBytecode.override' in output 2 of scenario "test"` - */ -// eslint-disable-next-line complexity -export const parseAuthenticationTemplateScenarioDataHdKeys = ( - hdKeys: object, - location: string -): string | AuthenticationTemplateScenarioData['hdKeys'] => { - const { addressIndex, hdPublicKeys, hdPrivateKeys } = hdKeys as { - addressIndex: unknown; - hdPublicKeys: unknown; - hdPrivateKeys: unknown; - }; - - const maximumAddressIndex = 2147483648; - if ( - addressIndex !== undefined && - !isRangedInteger(addressIndex, 0, maximumAddressIndex) - ) { - return `If defined, the "data.hdKeys.addressIndex" property of ${location} must be a positive integer between 0 and 2,147,483,648 (inclusive).`; - } - - if ( - hdPublicKeys !== undefined && - !(isObject(hdPublicKeys) && isStringObject(hdPublicKeys)) - ) { - return `If defined, the "data.hdKeys.hdPublicKeys" property of ${location} must be an object, and each value must be a string.`; - } - - if ( - hdPrivateKeys !== undefined && - !(isObject(hdPrivateKeys) && isStringObject(hdPrivateKeys)) - ) { - return `If defined, the "data.hdKeys.hdPrivateKeys" property of ${location} must be an object, and each value must be a string.`; - } - - return { - ...(addressIndex === undefined ? {} : { addressIndex }), - ...(hdPublicKeys === undefined - ? {} - : { hdPublicKeys: { ...hdPublicKeys } }), - ...(hdPrivateKeys === undefined - ? {} - : { hdPrivateKeys: { ...hdPrivateKeys } }), - }; -}; - -/** - * Validate and clone an Authentication Template Scenario `data.keys` object. - * - * @param keys - the `data.keys` object to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `scenario "test"` or - * `'lockingBytecode.override' in output 2 of scenario "test"` - */ -export const parseAuthenticationTemplateScenarioDataKeys = ( - keys: object, - location: string -): string | AuthenticationTemplateScenarioData['keys'] => { - const { privateKeys } = keys as { privateKeys: unknown }; - - if ( - privateKeys !== undefined && - !(isObject(privateKeys) && isObjectOfValidPrivateKeys(privateKeys)) - ) { - return `If defined, the "data.keys.privateKeys" property of ${location} must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.`; - } - - return { ...(privateKeys === undefined ? {} : { privateKeys }) }; -}; - -/** - * Validate and clone an Authentication Template Scenario `data` object. - * - * @param data - the `data` object to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `scenario "test"` or - * `'lockingBytecode.override' in output 2 of scenario "test"` - */ -// eslint-disable-next-line complexity -export const parseAuthenticationTemplateScenarioData = ( - data: object, - location: string -): string | AuthenticationTemplateScenarioData => { - const { - bytecode, - currentBlockHeight, - currentBlockTime, - hdKeys, - keys, - } = data as { - bytecode: unknown; - currentBlockHeight: unknown; - currentBlockTime: unknown; - hdKeys: unknown; - keys: unknown; - }; - if ( - bytecode !== undefined && - (!isObject(bytecode) || !isStringObject(bytecode)) - ) { - return `If defined, the "data.bytecode" property of ${location} must be an object, and each value must be a string.`; - } - - const minimumBlockTime = 500000000; - const maximumBlockTime = 4294967295; - if ( - currentBlockHeight !== undefined && - !isRangedInteger(currentBlockHeight, 0, minimumBlockTime - 1) - ) { - return `If defined, the "currentBlockHeight" property of ${location} must be a positive integer from 0 to 499,999,999 (inclusive).`; - } - - if ( - currentBlockTime !== undefined && - !isRangedInteger(currentBlockTime, minimumBlockTime, maximumBlockTime) - ) { - return `If defined, the "currentBlockTime" property of ${location} must be a positive integer from 500,000,000 to 4,294,967,295 (inclusive).`; - } - - const hdKeysResult = - hdKeys === undefined - ? undefined - : isObject(hdKeys) - ? parseAuthenticationTemplateScenarioDataHdKeys(hdKeys, location) - : `If defined, the "data.hdKeys" property of ${location} must be an object.`; - - if (typeof hdKeysResult === 'string') { - return hdKeysResult; - } - - const keysResult = - keys === undefined - ? undefined - : isObject(keys) - ? parseAuthenticationTemplateScenarioDataKeys(keys, location) - : `If defined, the "data.keys" property of ${location} must be an object.`; - - if (typeof keysResult === 'string') { - return keysResult; - } - - return { - ...(bytecode === undefined ? {} : { bytecode: { ...bytecode } }), - ...(currentBlockHeight === undefined ? {} : { currentBlockHeight }), - ...(currentBlockTime === undefined ? {} : { currentBlockTime }), - ...(hdKeysResult === undefined ? {} : { hdKeys: hdKeysResult }), - ...(keysResult === undefined ? {} : { keys: keysResult }), - }; -}; - -/** - * Validate and clone an Authentication Template Scenario `transaction.inputs` - * array. - * - * @param inputs - the `transaction.inputs` array to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `scenario "test"` - */ -export const parseAuthenticationTemplateScenarioTransactionInputs = ( - inputs: unknown, - location: string -): undefined | string | AuthenticationTemplateScenarioInput[] => { - if (inputs === undefined) { - return undefined; - } - - if (!isDenseArray(inputs)) { - return `If defined, the "transaction.inputs" property of ${location} must be an array of scenario input objects.`; - } - - const inputResults: (AuthenticationTemplateScenarioInput | string)[] = inputs - // eslint-disable-next-line complexity - .map((maybeInput, inputIndex) => { - const { - outpointIndex, - outpointTransactionHash, - sequenceNumber, - unlockingBytecode, - } = maybeInput as { - outpointIndex: unknown; - outpointTransactionHash: unknown; - sequenceNumber: unknown; - unlockingBytecode: unknown; - }; - const newLocation = `input ${inputIndex} in ${location}`; - if (outpointIndex !== undefined && !isPositiveInteger(outpointIndex)) { - return `If defined, the "outpointIndex" property of ${newLocation} must be a positive integer.`; - } - - const characterLength32ByteHash = 64; - if ( - outpointTransactionHash !== undefined && - !( - isHexString(outpointTransactionHash) && - outpointTransactionHash.length === characterLength32ByteHash - ) - ) { - return `If defined, the "outpointTransactionHash" property of ${newLocation} must be a 32-byte, hexadecimal-encoded hash (string).`; - } - - const maxSequenceNumber = 0xffffffff; - if ( - sequenceNumber !== undefined && - !isRangedInteger(sequenceNumber, 0, maxSequenceNumber) - ) { - return `If defined, the "sequenceNumber" property of ${newLocation} must be a number between 0 and 4294967295 (inclusive).`; - } - - if ( - unlockingBytecode !== undefined && - unlockingBytecode !== null && - !isHexString(unlockingBytecode) - ) { - return `If defined, the "unlockingBytecode" property of ${newLocation} must be either a null value or a hexadecimal-encoded string.`; - } - - return { - ...(outpointIndex === undefined ? {} : { outpointIndex }), - ...(outpointTransactionHash === undefined - ? {} - : { outpointTransactionHash }), - ...(sequenceNumber === undefined ? {} : { sequenceNumber }), - ...(unlockingBytecode === undefined ? {} : { unlockingBytecode }), - }; - }); - - const invalidInputResults = inputResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidInputResults.length > 0) { - return invalidInputResults.join(' '); - } - const clonedInputs = inputResults as AuthenticationTemplateScenarioInput[]; - return clonedInputs; -}; - -/** - * Validate and clone an Authentication Template Scenario transaction output - * `lockingBytecode` object. - * - * @param outputs - the `transaction.outputs[outputIndex].lockingBytecode` - * object to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `output 2 in scenario "test"` - */ -// eslint-disable-next-line complexity -export const parseAuthenticationTemplateScenarioTransactionOutputLockingBytecode = ( - lockingBytecode: object, - location: string -): string | AuthenticationTemplateScenarioOutput['lockingBytecode'] => { - const { overrides, script } = lockingBytecode as { - overrides: unknown; - script: unknown; - }; - - if (script !== undefined && script !== null && !isHexString(script)) { - return `If defined, the "script" property of ${location} must be a hexadecimal-encoded string or "null".`; - } - - const clonedOverrides = - overrides === undefined - ? undefined - : isObject(overrides) - ? parseAuthenticationTemplateScenarioData( - overrides, - `'lockingBytecode.override' in ${location}` - ) - : `If defined, the "overrides" property of ${location} must be an object.`; - - if (typeof clonedOverrides === 'string') { - return clonedOverrides; - } - - return { - ...(script === undefined ? {} : { script }), - ...(clonedOverrides === undefined ? {} : { overrides: clonedOverrides }), - }; -}; - -/** - * Validate and clone an Authentication Template Scenario `transaction.outputs` - * array. - * - * @param outputs - the `transaction.outputs` array to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `of output 2 in scenario "test"` - */ -export const parseAuthenticationTemplateScenarioTransactionOutputs = ( - outputs: unknown, - location: string -): undefined | string | AuthenticationTemplateScenarioOutput[] => { - if (outputs === undefined) { - return undefined; - } - - if (!isDenseArray(outputs)) { - return `If defined, the "transaction.outputs" property of ${location} must be an array of scenario output objects.`; - } - - const outputResults: ( - | AuthenticationTemplateScenarioOutput - | string - )[] = outputs - // eslint-disable-next-line complexity - .map((maybeOutput, outputIndex) => { - const { lockingBytecode, satoshis } = maybeOutput as { - lockingBytecode: unknown; - satoshis: unknown; - }; - - const newLocation = `output ${outputIndex} in ${location}`; - if ( - lockingBytecode !== undefined && - typeof lockingBytecode !== 'string' && - !isObject(lockingBytecode) - ) { - return `If defined, the "lockingBytecode" property of ${newLocation} must be a string or an object.`; - } - - if ( - typeof lockingBytecode === 'string' && - !isHexString(lockingBytecode) - ) { - return `If the "lockingBytecode" property of ${newLocation} is a string, it must be a valid, hexadecimal-encoded locking bytecode.`; - } - - const clonedLockingBytecode = - lockingBytecode === undefined || typeof lockingBytecode === 'string' - ? undefined - : parseAuthenticationTemplateScenarioTransactionOutputLockingBytecode( - lockingBytecode, - newLocation - ); - - if (typeof clonedLockingBytecode === 'string') { - return clonedLockingBytecode; - } - - if (!isValidSatoshisValue(satoshis)) { - return `If defined, the "satoshis" property of ${newLocation} must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).`; - } - - return { - ...(lockingBytecode === undefined - ? {} - : typeof lockingBytecode === 'string' - ? { lockingBytecode } - : { lockingBytecode: clonedLockingBytecode }), - ...(satoshis === undefined ? {} : { satoshis }), - }; - }); - - const invalidOutputResults = outputResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidOutputResults.length > 0) { - return invalidOutputResults.join(' '); - } - const clonedOutputs = outputResults as AuthenticationTemplateScenarioOutput[]; - - if (clonedOutputs.length === 0) { - return `If defined, the "transaction.outputs" property of ${location} must be have at least one output.`; - } - return clonedOutputs; -}; - -/** - * Validate and clone an Authentication Template Scenario `transaction` object. - * - * @param transaction - the `transaction` object to validate and clone - * @param location - the location of the error to specify in error messages, - * e.g. `of output 2 in scenario "test"` - */ -// eslint-disable-next-line complexity -export const parseAuthenticationTemplateScenarioTransaction = ( - transaction: object, - location: string -): string | AuthenticationTemplateScenario['transaction'] => { - const { inputs, locktime, outputs, version } = transaction as { - inputs: unknown; - locktime: unknown; - outputs: unknown; - version: unknown; - }; - - const maximumLocktime = 4294967295; - if ( - locktime !== undefined && - !isRangedInteger(locktime, 0, maximumLocktime) - ) { - return `If defined, the "locktime" property of ${location} must be an integer between 0 and 4,294,967,295 (inclusive).`; - } - - const maximumVersion = 4294967295; - if (version !== undefined && !isRangedInteger(version, 0, maximumVersion)) { - return `If defined, the "version" property of ${location} must be an integer between 0 and 4,294,967,295 (inclusive).`; - } - - const clonedInputs = parseAuthenticationTemplateScenarioTransactionInputs( - inputs, - location - ); - - if (typeof clonedInputs === 'string') { - return clonedInputs; - } - - const clonedOutputs = parseAuthenticationTemplateScenarioTransactionOutputs( - outputs, - location - ); - - if (typeof clonedOutputs === 'string') { - return clonedOutputs; - } - - return { - ...(locktime === undefined ? {} : { locktime }), - ...(clonedInputs === undefined ? {} : { inputs: clonedInputs }), - ...(clonedOutputs === undefined ? {} : { outputs: clonedOutputs }), - ...(version === undefined ? {} : { version }), - }; -}; - -/** - * Validate and clone an object of Authentication Template scenarios. - * - * @param scenarios - the scenarios object to validate and clone - */ -export const parseAuthenticationTemplateScenarios = (scenarios: object) => { - const unknownScenarios = Object.entries(scenarios).map<{ - id: string; - scenario: unknown; - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - }>(([id, scenario]) => ({ id, scenario })); - - const nonObjectScenarios = unknownScenarios - .filter(({ scenario }) => typeof scenario !== 'object' || scenario === null) - .map(({ id }) => id); - if (nonObjectScenarios.length > 0) { - return `All authentication template scenarios must be objects, but the following scenarios are not objects: ${listIds( - nonObjectScenarios - )}.`; - } - const allScenarios = unknownScenarios as { id: string; scenario: object }[]; - - const scenarioResults: ( - | { id: string; scenario: AuthenticationTemplateScenario } - | string - )[] = allScenarios - // eslint-disable-next-line complexity - .map(({ id, scenario }) => { - const { - data, - description, - extends: extendsProp, - name, - transaction, - value, - } = scenario as { - data: unknown; - description: unknown; - extends: unknown; - name: unknown; - transaction: unknown; - value: unknown; - }; - - const location = `scenario "${id}"`; - if (description !== undefined && typeof description !== 'string') { - return `If defined, the "description" property of ${location} must be a string.`; - } - - if (name !== undefined && typeof name !== 'string') { - return `If defined, the "name" property of ${location} must be a string.`; - } - - if (extendsProp !== undefined && typeof extendsProp !== 'string') { - return `If defined, the "extends" property of ${location} must be a string.`; - } - - if (!isValidSatoshisValue(value)) { - return `If defined, the "value" property of ${location} must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).`; - } - - if (data !== undefined && !isObject(data)) { - return `If defined, the "data" property of ${location} must be an object.`; - } - - if (transaction !== undefined && !isObject(transaction)) { - return `If defined, the "transaction" property of ${location} must be an object.`; - } - - const dataResult = - data === undefined - ? undefined - : parseAuthenticationTemplateScenarioData(data, location); - - if (typeof dataResult === 'string') { - return dataResult; - } - - const transactionResult = - transaction === undefined - ? undefined - : parseAuthenticationTemplateScenarioTransaction( - transaction, - location - ); - - if (typeof transactionResult === 'string') { - return transactionResult; - } - - const inputsUnderTest = transactionResult?.inputs?.filter( - (input) => - input.unlockingBytecode === undefined || - input.unlockingBytecode === null - ); - if (inputsUnderTest !== undefined && inputsUnderTest.length !== 1) { - return `If defined, the "transaction.inputs" array of ${location} must have exactly one input under test (an "unlockingBytecode" set to "null").`; - } - - return { - id, - scenario: { - ...(dataResult === undefined ? {} : { data: dataResult }), - ...(description === undefined ? {} : { description }), - ...(extendsProp === undefined ? {} : { extends: extendsProp }), - ...(name === undefined ? {} : { name }), - ...(transactionResult === undefined - ? {} - : { transaction: transactionResult }), - ...(value === undefined ? {} : { value }), - }, - }; - }); - - const invalidScenarioResults = scenarioResults.filter( - (result): result is string => typeof result === 'string' - ); - if (invalidScenarioResults.length > 0) { - return invalidScenarioResults.join(' '); - } - const validScenarioResults = scenarioResults as { - id: string; - scenario: AuthenticationTemplateScenario; - }[]; - const clonedScenarios = validScenarioResults.reduce<{ - [id: string]: AuthenticationTemplateScenario; - }>((all, result) => ({ ...all, [result.id]: result.scenario }), {}); - - const unknownExtends = Object.values(clonedScenarios).reduce( - (all, scenario) => - scenario.extends !== undefined && - (clonedScenarios[scenario.extends] as - | AuthenticationTemplateScenario - | undefined) === undefined - ? [...all, scenario.extends] - : all, - [] - ); - if (unknownExtends.length > 0) { - return `If defined, each scenario ID referenced by another scenario's "extends" property must exist. Unknown scenario IDs: ${listIds( - unknownExtends - )}.`; - } - return clonedScenarios; -}; - -const isVersion0 = (maybeTemplate: object): maybeTemplate is { version: 0 } => - (maybeTemplate as { version?: unknown }).version === 0; - -const schemaIsOptionalString = ( - maybeTemplate: object -): maybeTemplate is { $schema?: string } => { - const property = (maybeTemplate as { $schema?: unknown }).$schema; - return property === undefined || typeof property === 'string'; -}; - -const nameIsOptionalString = ( - maybeTemplate: object -): maybeTemplate is { name?: string } => { - const property = (maybeTemplate as { name?: unknown }).name; - return property === undefined || typeof property === 'string'; -}; - -const descriptionIsOptionalString = ( - maybeTemplate: object -): maybeTemplate is { description?: string } => { - const property = (maybeTemplate as { description?: unknown }).description; - return property === undefined || typeof property === 'string'; -}; - -const supportsOnlyValidVmIdentifiers = ( - maybeTemplate: object, - availableIdentifiers: Identifiers[] -): maybeTemplate is { supported: Identifiers[] } => { - const { supported } = maybeTemplate as { supported?: unknown }; - return ( - Array.isArray(supported) && - supported.every((value) => availableIdentifiers.includes(value)) - ); -}; - -/** - * Parse and validate an authentication template, returning either an error - * message as a string or a valid, safely-cloned `AuthenticationTemplate`. - * - * This method validates both the structure and the contents of a template: - * - All properties and sub-properties are verified to be of the expected type. - * - The ID of each entity, script, and scenario is confirmed to be unique. - * - Script IDs referenced by entities and other scripts (via `unlocks`) are - * confirmed to exist. - * - The derivation paths of each HdKey are validated against each other. - * - * This method does not validate the BTL contents of scripts (by attempting - * compilation, evaluate `AuthenticationTemplateScriptTest`s, or test scenario - * generation. Unknown properties are ignored and excluded from the final - * result. - * - * @param maybeTemplate - object to validate as an authentication template - */ -// eslint-disable-next-line complexity -export const validateAuthenticationTemplate = ( - maybeTemplate: unknown -): string | AuthenticationTemplate => { - if (typeof maybeTemplate !== 'object' || maybeTemplate === null) { - return 'A valid authentication template must be an object.'; - } - if (!isVersion0(maybeTemplate)) { - return 'Only version 0 authentication templates are currently supported.'; - } - - const vmIdentifiers = [ - 'BCH_2022_11_SPEC', - 'BCH_2022_11', - 'BCH_2022_05_SPEC', - 'BCH_2022_05', - 'BCH_2021_11_SPEC', - 'BCH_2021_11', - 'BCH_2021_05_SPEC', - 'BCH_2021_05', - 'BCH_2020_11_SPEC', - 'BCH_2020_11', - 'BCH_2020_05', - 'BCH_2019_11', - 'BCH_2019_05', - 'BSV_2018_11', - 'BTC_2017_08', - ] as AuthenticationVirtualMachineIdentifier[]; - if ( - !supportsOnlyValidVmIdentifiers(maybeTemplate, vmIdentifiers) || - // eslint-disable-next-line @typescript-eslint/no-explicit-any - maybeTemplate.supported.includes(undefined as any) - ) { - return `Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: ${vmIdentifiers.join( - ', ' - )}.`; - } - - if (!schemaIsOptionalString(maybeTemplate)) { - return 'The "$schema" property of an authentication template must be a string.'; - } - - if (!nameIsOptionalString(maybeTemplate)) { - return 'The "name" property of an authentication template must be a string.'; - } - if (!descriptionIsOptionalString(maybeTemplate)) { - return 'The "description" property of an authentication template must be a string.'; - } - - const { entities, scenarios, scripts } = (maybeTemplate as unknown) as { - entities: unknown; - scenarios: unknown; - scripts: unknown; - }; - - if (typeof entities !== 'object' || entities === null) { - return `The "entities" property of an authentication template must be an object.`; - } - - if (typeof scripts !== 'object' || scripts === null) { - return `The "scripts" property of an authentication template must be an object.`; - } - - if ( - scenarios !== undefined && - (typeof scenarios !== 'object' || scenarios === null) - ) { - return `If defined, the "scenarios" property of an authentication template must be an object.`; - } - - const parsedScripts = parseAuthenticationTemplateScripts(scripts); - if (typeof parsedScripts === 'string') { - return parsedScripts; - } - const clonedScripts = [ - ...Object.entries(parsedScripts.locking), - ...Object.entries(parsedScripts.other), - ...Object.entries(parsedScripts.tested), - ...Object.entries(parsedScripts.unlocking), - ].reduce((all, [id, script]) => ({ ...all, [id]: script }), {}); - - const clonedEntities = parseAuthenticationTemplateEntities(entities); - if (typeof clonedEntities === 'string') { - return clonedEntities; - } - - const clonedScenarios = - scenarios === undefined - ? undefined - : parseAuthenticationTemplateScenarios(scenarios); - if (typeof clonedScenarios === 'string') { - return clonedScenarios; - } - - const variableIds = Object.values(clonedEntities).reduce( - (all, entity) => - entity.variables === undefined - ? all - : [...all, ...Object.keys(entity.variables)], - [] - ); - const entityIds = Object.keys(clonedEntities); - const scriptIds = Object.keys(clonedScripts); - const scenarioIds = - clonedScenarios === undefined ? [] : Object.keys(clonedScenarios); - - const usedIds = [...variableIds, ...entityIds, ...scriptIds, ...scenarioIds]; - const builtInIds = [ - BuiltInVariables.currentBlockHeight, - BuiltInVariables.currentBlockTime, - BuiltInVariables.signingSerialization, - ]; - - const usedBuiltInIds = builtInIds.filter((builtInIdentifier) => - usedIds.includes(builtInIdentifier) - ); - if (usedBuiltInIds.length > 0) { - return `Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: ${listIds( - usedBuiltInIds - )}.`; - } - - const idUsageCount = usedIds.reduce<{ [id: string]: number }>( - (count, id) => ({ - ...count, - [id]: ((count[id] as number | undefined) ?? 0) + 1, - }), - {} - ); - const duplicateIds = Object.entries(idUsageCount) - .filter(([, count]) => count > 1) - .map(([id]) => id); - - if (duplicateIds.length > 0) { - return `The ID of each entity, variable, script, and scenario in an authentication template must be unique. The following IDs are re-used: ${listIds( - duplicateIds - )}.`; - } - - const unknownScriptIds = Object.values(clonedEntities) - .reduce( - (all, entity) => - entity.scripts === undefined ? all : [...all, ...entity.scripts], - [] - ) - .reduce( - (unique, id) => - scriptIds.includes(id) || unique.includes(id) - ? unique - : [...unique, id], - [] - ); - - if (unknownScriptIds.length > 0) { - return `Only known scripts may be assigned to entities. The following script IDs are not provided in this template: ${listIds( - unknownScriptIds - )}.`; - } - - const unknownScenarioIds = [ - ...Object.values(parsedScripts.unlocking).reduce( - (all, script) => [ - ...all, - ...(script.estimate === undefined ? [] : [script.estimate]), - ...(script.fails === undefined ? [] : script.fails), - ...(script.invalid === undefined ? [] : script.invalid), - ...(script.passes === undefined ? [] : script.passes), - ], - [] - ), - ...Object.values(parsedScripts.tested).reduce( - (all, script) => [ - ...all, - ...script.tests.reduce( - (fromScript, test) => [ - ...fromScript, - ...(test.fails === undefined ? [] : test.fails), - ...(test.invalid === undefined ? [] : test.invalid), - ...(test.passes === undefined ? [] : test.passes), - ], - [] - ), - ], - [] - ), - ].reduce( - (unique, id) => - scenarioIds.includes(id) || unique.includes(id) - ? unique - : [...unique, id], - [] - ); - - if (unknownScenarioIds.length > 0) { - return `Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: ${listIds( - unknownScenarioIds - )}.`; - } - - const entityIdsReferencedByScenarioData = ( - data: AuthenticationTemplateScenarioData | undefined - ) => { - const hdPublicKeyEntityIds = - data?.hdKeys?.hdPublicKeys === undefined - ? [] - : Object.keys(data.hdKeys.hdPublicKeys); - const hdPrivateKeyEntityIds = - data?.hdKeys?.hdPrivateKeys === undefined - ? [] - : Object.keys(data.hdKeys.hdPrivateKeys); - return [...hdPublicKeyEntityIds, ...hdPrivateKeyEntityIds]; - }; - const unknownEntityIds = - clonedScenarios === undefined - ? [] - : Object.values(clonedScenarios) - .reduce( - (all, scenario) => [ - ...all, - ...entityIdsReferencedByScenarioData(scenario.data), - ...(scenario.transaction?.outputs ?? []).reduce( - (fromOverrides, output) => - isObject(output.lockingBytecode) - ? [ - ...fromOverrides, - ...entityIdsReferencedByScenarioData( - output.lockingBytecode.overrides - ), - ] - : fromOverrides, - [] - ), - ], - [] - ) - .reduce( - (unique, id) => - entityIds.includes(id) || unique.includes(id) - ? unique - : [...unique, id], - [] - ); - - if (unknownEntityIds.length > 0) { - return `Only known entities may be referenced by hdKeys properties within scenarios. The following entity IDs are not provided in this template: ${listIds( - unknownEntityIds - )}.`; - } - - return { - ...(maybeTemplate.$schema === undefined - ? {} - : { $schema: maybeTemplate.$schema }), - ...(maybeTemplate.description === undefined - ? {} - : { description: maybeTemplate.description }), - entities: clonedEntities, - ...(maybeTemplate.name === undefined ? {} : { name: maybeTemplate.name }), - scenarios: clonedScenarios, - scripts: clonedScripts, - supported: maybeTemplate.supported, - version: maybeTemplate.version, - } as AuthenticationTemplate; -}; diff --git a/src/lib/template/template.ts b/src/lib/template/template.ts deleted file mode 100644 index 6d19e2a6..00000000 --- a/src/lib/template/template.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './compiler-bch/compiler-bch'; -export * from './language/language'; -export * from './compiler-defaults'; -export * from './compiler-operation-helpers'; -export * from './compiler-operations'; -export * from './compiler-types'; -export * from './compiler'; -export * from './scenarios'; -export * from './standard/standard'; -export * from './template-types'; -export * from './template-validation'; diff --git a/src/lib/transaction/estimate-transaction.ts b/src/lib/transaction/estimate-transaction.ts index 85251649..25020047 100644 --- a/src/lib/transaction/estimate-transaction.ts +++ b/src/lib/transaction/estimate-transaction.ts @@ -1,17 +1,16 @@ -import { Compiler } from '../template/compiler-types'; - -import { - TransactionContextCommon, +import type { + AnyCompilerConfiguration, + Compiler, TransactionGenerationAttempt, TransactionTemplateEstimated, -} from './transaction-types'; +} from '../lib'; /** - * Generate an "estimated" transaction – an invalid transaction which matches + * Generate an "estimated" transaction – an invalid transaction that matches * the expected size of the final transaction. * * This is useful for estimating the required transaction fee before attempting - * to properly sign the transaction – especially for transaction which require + * to properly sign the transaction – especially for transactions that require * approval and signatures from multiple entities. An estimated transaction can * be quickly generated by a single entity without requiring any variable data * (like private keys or wallet data). @@ -19,24 +18,28 @@ import { * @remarks * Like `generateTransaction` This method accepts a transaction template and * generates bytecode given all compilation directives, however, each directive - * must also contain an `estimate` scenario ID which will be used as the `data` - * in the compilation. The template must also include an `inputSatoshis` value - * (the total satoshi value of all transaction inputs). + * must also contain an `estimate` scenario ID that will be used as the `data` + * in the compilation. The template must also include a + * `totalInputValueSatoshis` value (the total satoshi value of all transaction + * inputs). * - * The `satoshis` value of each output is also optional. (All output `satoshis` - * values will be set to `invalidSatoshis` to guarantee the transaction's - * invalidity). + * The `valueSatoshis` property of each output is also optional. (All output + * `valueSatoshis` properties will be set to `excessiveSatoshis` to guarantee the + * transaction's invalidity). *s * @param template - the transaction template from which to generate the * "estimated" transaction */ export const estimateTransaction = < - CompilerType extends Compiler + CompilerType extends Compiler< + unknown, + AnyCompilerConfiguration, + unknown + > >( template: Readonly> -): TransactionGenerationAttempt => { +): TransactionGenerationAttempt => // TODO: estimateTransaction - return typeof template === 'object' + typeof template === 'object' ? { completions: [], errors: [], stage: 'inputs', success: false } : { completions: [], errors: [], stage: 'inputs', success: false }; -}; diff --git a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts index ac3c6a0f..d458d5ea 100644 --- a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts +++ b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts @@ -1,14 +1,12 @@ /* eslint-disable no-console, functional/no-expression-statement */ -import { stringify } from '../../format/log'; -import { authenticationTemplateP2pkh } from '../../template/template'; +import { authenticationTemplateP2pkh, stringify } from '../../lib.js'; -import { oneOfEightTreeSig } from './template.1-of-8-tree.spec.helper'; -import { twoOfTwoRecoverable } from './template.2-of-2-recoverable.spec.helper'; -import { twoOfThree } from './template.2-of-3.spec.helper'; -import { cashChannels } from './template.cash-channels.spec.helper'; -import { sigOfSig } from './template.sig-of-sig.spec.helper'; +import { twoOfTwoRecoverable } from './template.2-of-2-recoverable.spec.helper.js'; +import { twoOfThree } from './template.2-of-3.spec.helper.js'; +import { cashChannels } from './template.cash-channels.spec.helper.js'; +import { sigOfSig } from './template.sig-of-sig.spec.helper.js'; -// eslint-disable-next-line complexity +// eslint-disable-next-line complexity, functional/no-return-void const printTemplate = (template: string) => { switch (template) { case 'p2pkh': @@ -20,16 +18,13 @@ const printTemplate = (template: string) => { case '2-of-2-recoverable': console.log(stringify(twoOfTwoRecoverable)); return; - case '1-of-8-tree': - console.log(stringify(oneOfEightTreeSig)); - return; case 'sig-of-sig': console.log(stringify(sigOfSig)); return; case 'cash-channels': console.log(stringify(cashChannels)); return; - // eslint-disable-next-line functional/no-conditional-statement + default: console.error('unknown template'); process.exit(1); @@ -37,4 +32,5 @@ const printTemplate = (template: string) => { }; const [, , arg] = process.argv; -printTemplate(arg); +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +printTemplate(arg!); diff --git a/src/lib/transaction/fixtures/template.1-of-8-tree.spec.helper.ts b/src/lib/transaction/fixtures/template.1-of-8-tree.spec.helper.ts deleted file mode 100644 index dbf9ec50..00000000 --- a/src/lib/transaction/fixtures/template.1-of-8-tree.spec.helper.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* eslint-disable camelcase, @typescript-eslint/naming-convention, @typescript-eslint/no-magic-numbers */ -import { - AuthenticationTemplate, - AuthenticationTemplateHdKey, -} from '../../template/template-types'; - -/** - * This is a mostly-hard-coded 1-of-8 example. A more general function could - * be written to create m-of-n wallets. - * - * TODO: this is very broken - OP_LESSTHAN requires a valid 4-byte script number, this script assumes it can accept a 20-byte hash. Probably should rework this template to provide the path in the unlocking script as in: https://www.reddit.com/r/btc/comments/8joo00/first_tree_signature_on_bitcoin_cash_using_new/ - */ -export const oneOfEightTreeSig: AuthenticationTemplate = { - ...{ - name: '1-of-8 Tree Signature', - }, - description: `A 1-of-8 P2SH tree signature authentication template, based on: https://www.yours.org/content/tree-signature-variations-using-commutative-hash-trees-8a898830203a - - root - / \\ - a1 a2 - / \\ / \\ - b1 b2 b3 b4 - /\\ /\\ /\\ /\\ - c | | | | | | | | - 1 2 3 4 5 6 7 8 - - The tree contains 5 levels: - - root - - a - concat and hash of b - - b - concat and hash of c - - c - hash of each respective public key - - # - each respective public key`, - entities: [1, 2, 3, 4, 5, 6, 7, 8].reduce( - (acc, i) => ({ - ...acc, - [`signer_${i}`]: { - name: `Signer ${i}`, - scripts: ['lock', `unlock_${i}`], - variables: { - [`key${i}`]: { - type: 'HdKey' as const, - } as AuthenticationTemplateHdKey, - }, - }, - }), - {} - ), - scripts: { - ...[ - ['root', 'a1', 'a2'], - ['a1', 'b1', 'b2'], - ['a2', 'b3', 'b4'], - ['b1', 'c1', 'c2'], - ['b2', 'c3', 'c4'], - ['b3', 'c5', 'c6'], - ['b4', 'c7', 'c8'], - ].reduce( - (acc, [id, left, right]) => ({ - ...acc, - [id]: { - name: id, - script: `${left} ${right} hash_node`, - }, - }), - {} - ), - ...[1, 2, 3, 4, 5, 6, 7, 8].reduce( - (acc, i) => ({ - ...acc, - [`c${i}`]: { name: `c${i}`, script: ` OP_HASH160` }, - }), - {} - ), - hash_node: { - name: 'hash_node', - script: 'sort_cat OP_HASH160', - }, - lock: { - lockingType: 'p2sh', - name: '1-of-8 Tree Vault', - script: - 'OP_4 OP_PICK OP_HASH160 sort_cat OP_HASH160 sort_cat OP_HASH160 sort_cat OP_HASH160 <$(root)> OP_EQUALVERIFY OP_CHECKSIG', - }, - sort_cat: { - name: 'sort_cat', - script: 'OP_LESSTHAN OP_IF OP_SWAP OP_ENDIF OP_CAT', - }, - ...[ - [1, 2, 2, 2], - [2, 1, 2, 2], - [3, 4, 1, 2], - [4, 3, 1, 2], - [5, 6, 4, 1], - [6, 5, 4, 1], - [7, 8, 3, 1], - [8, 7, 3, 1], - ].reduce( - (acc, [key, sibling, bSibling, aSibling]) => ({ - ...acc, - [`unlock_${key}`]: { - name: `Spend - Signer ${key}`, - script: ` <$(a${aSibling})> <$(b${bSibling})> <$(c${sibling})>`, - unlocks: 'lock', - }, - }), - {} - ), - }, - supported: ['BCH_2019_11'], - version: 0, -}; diff --git a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts index 069b623a..3e2f172e 100644 --- a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts @@ -1,6 +1,6 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import { CompilerDefaults } from '../../template/compiler-defaults'; -import { AuthenticationTemplate } from '../../template/template-types'; +import type { AuthenticationTemplate } from '../../lib'; +import { CompilerDefaults } from '../../lib.js'; const secondsIn30Days = 2592000; @@ -67,7 +67,7 @@ export const twoOfTwoRecoverable: AuthenticationTemplate = { }, scripts: { lock: { - lockingType: 'p2sh', + lockingType: 'p2sh20', name: '2-of-2 Recoverable Vault', script: 'OP_IF\n <$(\n \n OP_ADD\n )>\n OP_CHECKLOCKTIMEVERIFY OP_DROP\n \n OP_CHECKSIGVERIFY\n <1>\nOP_ELSE\n <2>\nOP_ENDIF\n <2>\nOP_CHECKMULTISIG', @@ -101,6 +101,6 @@ export const twoOfTwoRecoverable: AuthenticationTemplate = { unlocks: 'lock', }, }, - supported: ['BCH_2019_11'], + supported: ['BCH_2021_05', 'BCH_2022_05'], version: 0, }; diff --git a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts index 395559dc..d7bf5920 100644 --- a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import { +import type { AuthenticationTemplate, AuthenticationTemplateEntity, -} from '../../template/template-types'; +} from '../../lib'; const createSigner = ( name: string, @@ -46,12 +46,12 @@ export const twoOfThree: AuthenticationTemplate = { unlocks: 'lock', }, lock: { - lockingType: 'p2sh', + lockingType: 'p2sh20', name: '2-of-3 Vault', script: 'OP_2\n\n\n\nOP_3\nOP_CHECKMULTISIG', }, }, - supported: ['BCH_2019_11'], + supported: ['BCH_2021_05', 'BCH_2022_05'], version: 0, }; diff --git a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts b/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts index cb6e6361..d48f27c8 100644 --- a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts @@ -1,11 +1,10 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -// cspell:ignore bitcoinvarint, IDE\'s -import { AuthenticationTemplate } from '../../template/template-types'; +import type { AuthenticationTemplate } from '../../lib'; export const cashChannels: AuthenticationTemplate = { $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', description: - '**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel which allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To “top up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.', + '**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To “top up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.', entities: { owner_entity: { description: @@ -14,19 +13,19 @@ export const cashChannels: AuthenticationTemplate = { variables: { authorized_amount: { description: - 'The value of the authorized payment in terms of the denominating asset encoded as a Script Number, e.g. `10000`.\n\nIf the denominating asset is BCH, this number is represented in satoshis. If the denominating asset is another currency, it should be represented in the smallest common decimal unit of that currency, e.g. for $100.00 "USD", this value should be `10000`. All fiat currencies must be represented with 2 decimal places, even for currencies where fractional units are not commonly used, e.g. IRR, VND, IDR.\n\nBecause this value is not operated upon by the locking script, if desired, the value may be encrypted (using a key shared by all entities) so the terms of authorizations are not publicly auditable.', + 'The value of the authorized payment in terms of the denominating asset encoded as a VM Number, e.g. `10000`.\n\nIf the denominating asset is BCH, this number is represented in satoshis. If the denominating asset is another currency, it should be represented in the smallest common decimal unit of that currency, e.g. for $100.00 "USD", this value should be `10000`. All fiat currencies must be represented with 2 decimal places, even for currencies where fractional units are not commonly used, e.g. IRR, VND, IDR.\n\nBecause this value is not operated upon by the locking script, if desired, the value may be encrypted (using a key shared by all entities) so the terms of authorizations are not publicly auditable.', name: 'Authorized Amount', type: 'AddressData', }, denominating_asset: { description: - 'The asset in which the Authorized Amount is specified. This should be an identifier (like a currency code or ticker symbol) which is understood by each party, encoded as a UTF8Literal, e.g. `"BCH"`, `"XAU"`, or `"USD"`. \n\nIf desired, the value can be encrypted (using a key shared by all entities) so the exact terms of the transaction are not publicly auditable.', + 'The asset in which the Authorized Amount is specified. This should be an identifier (like a currency code or ticker symbol) that is understood by each party, encoded as a UTF8Literal, e.g. `"BCH"`, `"XAU"`, or `"USD"`. \n\nIf desired, the value can be encrypted (using a key shared by all entities) so the exact terms of the transaction are not publicly auditable.', name: 'Denominating Asset', type: 'AddressData', }, maximum_authorized_satoshis: { description: - "The maximum allowed satoshi value of a payment authorization, encoded as a Script Number, e.g. `10000`.\n\nIf the Denominating Asset is BCH, this is the exact value of the payment.\n\nIf the Denominating Asset is not BCH, the exact payment amount is chosen by the Rate Oracle (Payment Satoshis). If the rate has changed dramatically enough that the payment will exceed the Maximum Authorized Satoshis, the authorization is no longer valid, and the Owner must sign another authorization with a higher Maximum Authorized Satoshis value. The Owner should calculate this based on the percentage market price increase they're willing to continue allowing this authorization. E.g.: maximum_authorized_satoshis = current_estimated_satoshis * (1 + price_flexibility_percentage)", + "The maximum allowed satoshi value of a payment authorization, encoded as a VM Number, e.g. `10000`.\n\nIf the Denominating Asset is BCH, this is the exact value of the payment.\n\nIf the Denominating Asset is not BCH, the exact payment amount is chosen by the Rate Oracle (Payment Satoshis). If the rate has changed dramatically enough that the payment will exceed the Maximum Authorized Satoshis, the authorization is no longer valid, and the Owner must sign another authorization with a higher Maximum Authorized Satoshis value. The Owner should calculate this based on the percentage market price increase they're willing to continue allowing this authorization. E.g.: maximum_authorized_satoshis = current_estimated_satoshis * (1 + price_flexibility_percentage)", name: 'Maximum Authorized Satoshis', type: 'AddressData', }, @@ -37,13 +36,13 @@ export const cashChannels: AuthenticationTemplate = { }, payment_number: { description: - 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a Script Number between 0 and 65534, e.g. `42`.', + 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.', name: 'Payment Number', type: 'AddressData', }, payment_time: { description: - 'The planned Block Time at which an Authorization should become valid for spending. This is also the time at which the Rate Oracle (if present) should determine the Payment Satoshis.\n\nMust be encoded as a Script Number (of up to 5 bytes as is consumed by OP_CHECKLOCKTIMEVERIFY).', + 'The planned Block Time at which an Authorization should become valid for spending. This is also the time at which the Rate Oracle (if present) should determine the Payment Satoshis.\n\nMust be encoded as a VM Number (of up to 5 bytes as is consumed by OP_CHECKLOCKTIMEVERIFY).', name: 'Payment Time', type: 'AddressData', }, @@ -107,6 +106,7 @@ export const cashChannels: AuthenticationTemplate = { description: 'An example attempting to execute a payment authorization before the payment time authorized by the owner. The authorization is for "1000" in asset "USD" (described in cents, so $10.00 USD), and it authorizes a payment of a maximum of 10500 satoshis. The hypothetical UTXO being spent has a value of 20000 satoshis.', name: '$10.00 USD – Before Payment Time', + sourceOutputs: [{ valueSatoshis: 20000 }], transaction: { locktime: 1577836800, outputs: [ @@ -121,11 +121,10 @@ export const cashChannels: AuthenticationTemplate = { }, }, }, - satoshis: 10000, + valueSatoshis: 10000, }, ], }, - value: 20000, }, exceeds_maximum_payment_number: { data: { @@ -153,7 +152,7 @@ export const cashChannels: AuthenticationTemplate = { }, scripts: { channel: { - lockingType: 'p2sh', + lockingType: 'p2sh20', name: 'Channel', script: '\nOP_SWAP\nOP_IF\n /**\n * Execute Authorization\n */\n OP_DUP OP_TOALTSTACK // save owner.public_key\n\n /**\n * Reconstruct payment authorization message\n */\n <6> OP_PICK // channel_identifier\n <15> OP_PICK // payment_number_padded\n <7> OP_PICK // maximum_authorized_satoshis\n OP_DUP\n <12> OP_PICK // payment_satoshis\n OP_GREATERTHANOREQUAL OP_VERIFY // maximum_authorized_satoshis >= payment_satoshis\n <8> OP_NUM2BIN\n <7> OP_PICK <8> OP_NUM2BIN // authorized_amount\n <7> OP_PICK <8> OP_NUM2BIN // denominating_asset\n <7> OP_PICK <8> OP_NUM2BIN // payment_time\n OP_CAT OP_CAT\n OP_DUP OP_TOALTSTACK // save (authorized_amount + denominating_asset + payment_time)\n OP_CAT OP_CAT OP_CAT\n OP_SWAP \n\n OP_CHECKDATASIGVERIFY // check payment authorization signature\n\n OP_CHECKLOCKTIMEVERIFY // fail if not past payment_time\n OP_2DROP OP_2DROP\n\n <8> OP_PICK // payment_number_padded\n \n OP_EQUALVERIFY // check against payment_number in authorization\n\n // reconstruct rate_claim\n OP_FROMALTSTACK\n <3> OP_PICK // payment_satoshis\n <8> OP_NUM2BIN\n OP_CAT\n\n\n OP_SWAP\n OP_FROMALTSTACK // load owner.public_key\n \n OP_DUP\n OP_TOALTSTACK // save receiver.public_key\n OP_CAT\n OP_HASH160\n\n OP_EQUALVERIFY // verify channel_identifier\n\n \n OP_CHECKDATASIGVERIFY // verify rate_claim\n\n <7> OP_PICK // covered_bytecode_before_payment_number\n <7> OP_PICK // payment_number_padded\n OP_BIN2NUM\n <1> OP_ADD <2> OP_NUM2BIN // next payment_number\n <7> OP_PICK // covered_bytecode_after_payment_number\n OP_CAT OP_CAT \n OP_HASH160 // P2SH redeem bytecode hash\n \n /**\n * prefix locking bytecode with its length (required in serialization)\n */\n <23>\n \n OP_ROT\n \n OP_CAT OP_CAT // expected locking bytecode\n OP_CAT // length + locking bytecode\n\n // calculate expected output value\n <5> OP_PICK // outpoint_value\n OP_BIN2NUM\n OP_ROT\n OP_SUB <8> OP_NUM2BIN // remaining balance\n OP_SWAP OP_CAT // expected output serialization\n OP_SWAP OP_CAT\n\n /**\n * Verify signing serialization transaction outputs (uncomment for testing)\n */\n // OP_DUP OP_TOALTSTACK\n // <8> OP_PICK // signing_serialization.transaction_outputs\n // OP_EQUALVERIFY\n // OP_FROMALTSTACK\n /**\n * End signing serialization transaction outputs verification (uncomment for testing)\n */\n\n OP_HASH256 // expected transaction_outputs_hash\n OP_SWAP\n OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT\n\n /**\n * Verify full signing serialization (uncomment for testing)\n */\n // OP_DUP OP_TOALTSTACK\n // OP_EQUALVERIFY\n // OP_FROMALTSTACK\n /**\n * End full signing serialization verification (uncomment for testing)\n */\n \n OP_SHA256\n\n OP_FROMALTSTACK\n OP_DUP\n <3> OP_PICK // receiver.schnorr_signature.all_outputs\n OP_ROT\n OP_CHECKSIGVERIFY // signature covers transaction\n OP_ROT \n <64> OP_SPLIT OP_DROP // remove signature serialization type bit\n OP_ROT OP_ROT\n OP_CHECKDATASIG // signature covers expected transaction\nOP_ELSE\n // Owner Spend\n OP_CHECKSIG\nOP_ENDIF \n\n\n', @@ -162,54 +161,54 @@ export const cashChannels: AuthenticationTemplate = { name: 'Channel Components', script: '/**\n * This is just a convenience script to split the locking bytecode\n * at the location of "payment_number_padded". Since this is used in\n * several places, using a single script makes updates easier.\n **/\n // The raw locking bytecode of the current channel\n<78> OP_SPLIT // the location of payment_number_padded in channel\n<2> OP_SPLIT // the length of payment_number_padded', - tests: [ - { + tests: { + contains_padded_payment_number: { check: '/**\n * Here we confirm that we split the bytecode at the\n * correct indexes:\n * - item 1 should be the bytecode before payment_number_padded\n * - item 2 should be payment_number_padded\n * - item 3 should be the bytecode after payment_number_padded\n */\n\n<1> OP_PICK OP_TOALTSTACK\n\nOP_CAT OP_CAT OP_EQUALVERIFY\n\nOP_FROMALTSTACK OP_EQUAL', name: 'Contains Padded Payment Number', passes: ['after_payment_time', 'before_payment_time'], }, - ], + }, }, channel_identifier: { name: 'Channel Identifier', pushed: true, script: '$(\n\nOP_CAT\nOP_HASH160)', - tests: [ - { + tests: { + expected_id: { check: '<0x564752b9f1c9f0246c8444a7f0a0ee8348f2e339>\nOP_EQUAL', name: 'Expected ID', }, - ], + }, }, covered_bytecode_after_payment_number: { name: 'Covered Bytecode After Payment Number', pushed: true, script: '$(\n channel_components <0> OP_PICK\n OP_NIP OP_NIP OP_NIP\n)', - tests: [ - { + tests: { + check_bytecode: { check: '<0x886c537958807e7c6c2102e493dbf1c10d80f3581e4904930b1404cc6c13900ee0758474fa94abe8c4cd13766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac68>\nOP_EQUAL', name: 'Check Bytecode', passes: ['test_bytecode_values'], }, - ], + }, }, covered_bytecode_before_payment_number: { name: 'Covered Bytecode Before Payment Number', pushed: true, script: '$(\n channel_components <2> OP_PICK\n OP_NIP OP_NIP OP_NIP\n)', - tests: [ - { + tests: { + check_bytecode: { check: '<0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d587902>\nOP_EQUAL', name: 'Check Bytecode', passes: ['test_bytecode_values'], }, - ], + }, }, execute_authorization: { fails: ['before_payment_time'], @@ -231,44 +230,44 @@ export const cashChannels: AuthenticationTemplate = { pushed: true, script: '$(\n \n \n <2> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT\n)', - tests: [ - { + tests: { + check_format: { check: '<0x564752b9f1c9f0246c8444a7f0a0ee8348f2e33902000429000000000000e803000000000000555344000000000080bf345e00000000>\nOP_EQUAL', name: 'Check Format', passes: ['before_payment_time'], }, - ], + }, }, payment_number_padded: { name: 'Payment Number Padded', pushed: true, script: '$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>', - tests: [ - { + tests: { + requires_uint16: { check: '<0x0200>\nOP_EQUAL', fails: ['exceeds_maximum_payment_number'], name: 'Requires Uint16', passes: ['before_payment_time'], }, - ], + }, }, rate_claim: { name: 'Rate Claim', pushed: true, script: '$(\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n OP_CAT\n OP_CAT\n OP_CAT\n)', - tests: [ - { + tests: { + check_format: { check: '<\n 0xe803000000000000\n 0x5553440000000000\n 0x80bf345e00000000\n 0x1027000000000000\n>\nOP_EQUAL', name: 'Check Format', passes: ['after_payment_time'], }, - ], + }, }, }, - supported: ['BCH_2019_05', 'BCH_2019_11'], + supported: ['BCH_2022_05'], version: 0, }; diff --git a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts index 31f68a40..408bcd8b 100644 --- a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts @@ -1,12 +1,12 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import { AuthenticationTemplate } from '../../template/template-types'; +import type { AuthenticationTemplate } from '../../lib'; export const sigOfSig: AuthenticationTemplate = { ...{ name: 'Sig-of-Sig Vault (2-of-2)', }, description: - 'An unusual example of a template which must be signed in a specific order: Second Signer may only sign after First Signer.', + 'An unusual example of a template that must be signed in a specific order: Second Signer may only sign after First Signer. This construction could be useful in scenarios where a particular signing order must be guaranteed, e.g. proving that a "most-responsible" party only signed for a transaction knowing they were the final signer.', entities: { signer_1: { name: 'First Signer', @@ -30,7 +30,7 @@ export const sigOfSig: AuthenticationTemplate = { script: 'first.signature.all_outputs', }, lock: { - lockingType: 'p2sh', + lockingType: 'p2sh20', name: 'Sig-of-Sig Vault', script: 'OP_2 OP_PICK OP_CHECKDATASIGVERIFY OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', @@ -41,6 +41,6 @@ export const sigOfSig: AuthenticationTemplate = { unlocks: 'lock', }, }, - supported: ['BCH_2019_11'], + supported: ['BCH_2021_05', 'BCH_2022_05'], version: 0, }; diff --git a/src/lib/transaction/fixtures/templates/1-of-8-tree.json b/src/lib/transaction/fixtures/templates/1-of-8-tree.json deleted file mode 100644 index 54f194de..00000000 --- a/src/lib/transaction/fixtures/templates/1-of-8-tree.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "name": "1-of-8 Tree Signature", - "description": "A 1-of-8 P2SH tree signature authentication template, based on: https://www.yours.org/content/tree-signature-variations-using-commutative-hash-trees-8a898830203a\n\n root\n / \\\n a1 a2\n / \\ / \\\n b1 b2 b3 b4\n /\\ /\\ /\\ /\\\n c | | | | | | | |\n 1 2 3 4 5 6 7 8\n\n The tree contains 5 levels:\n - root\n - a - concat and hash of b\n - b - concat and hash of c\n - c - hash of each respective public key\n - # - each respective public key", - "entities": { - "signer_1": { - "name": "Signer 1", - "scripts": ["lock", "unlock_1"], - "variables": { - "key1": { - "type": "HdKey" - } - } - }, - "signer_2": { - "name": "Signer 2", - "scripts": ["lock", "unlock_2"], - "variables": { - "key2": { - "type": "HdKey" - } - } - }, - "signer_3": { - "name": "Signer 3", - "scripts": ["lock", "unlock_3"], - "variables": { - "key3": { - "type": "HdKey" - } - } - }, - "signer_4": { - "name": "Signer 4", - "scripts": ["lock", "unlock_4"], - "variables": { - "key4": { - "type": "HdKey" - } - } - }, - "signer_5": { - "name": "Signer 5", - "scripts": ["lock", "unlock_5"], - "variables": { - "key5": { - "type": "HdKey" - } - } - }, - "signer_6": { - "name": "Signer 6", - "scripts": ["lock", "unlock_6"], - "variables": { - "key6": { - "type": "HdKey" - } - } - }, - "signer_7": { - "name": "Signer 7", - "scripts": ["lock", "unlock_7"], - "variables": { - "key7": { - "type": "HdKey" - } - } - }, - "signer_8": { - "name": "Signer 8", - "scripts": ["lock", "unlock_8"], - "variables": { - "key8": { - "type": "HdKey" - } - } - } - }, - "scripts": { - "root": { - "name": "root", - "script": "a1 a2 hash_node" - }, - "a1": { - "name": "a1", - "script": "b1 b2 hash_node" - }, - "a2": { - "name": "a2", - "script": "b3 b4 hash_node" - }, - "b1": { - "name": "b1", - "script": "c1 c2 hash_node" - }, - "b2": { - "name": "b2", - "script": "c3 c4 hash_node" - }, - "b3": { - "name": "b3", - "script": "c5 c6 hash_node" - }, - "b4": { - "name": "b4", - "script": "c7 c8 hash_node" - }, - "c1": { - "name": "c1", - "script": " OP_HASH160" - }, - "c2": { - "name": "c2", - "script": " OP_HASH160" - }, - "c3": { - "name": "c3", - "script": " OP_HASH160" - }, - "c4": { - "name": "c4", - "script": " OP_HASH160" - }, - "c5": { - "name": "c5", - "script": " OP_HASH160" - }, - "c6": { - "name": "c6", - "script": " OP_HASH160" - }, - "c7": { - "name": "c7", - "script": " OP_HASH160" - }, - "c8": { - "name": "c8", - "script": " OP_HASH160" - }, - "hash_node": { - "name": "hash_node", - "script": "sort_cat OP_HASH160" - }, - "lock": { - "lockingType": "p2sh", - "name": "1-of-8 Tree Vault", - "script": "OP_4 OP_PICK OP_HASH160 sort_cat OP_HASH160 sort_cat OP_HASH160 sort_cat OP_HASH160 <$(root)> OP_EQUALVERIFY OP_CHECKSIG" - }, - "sort_cat": { - "name": "sort_cat", - "script": "OP_LESSTHAN OP_IF OP_SWAP OP_ENDIF OP_CAT" - }, - "unlock_1": { - "name": "Spend - Signer 1", - "script": " <$(a2)> <$(b2)> <$(c2)>", - "unlocks": "lock" - }, - "unlock_2": { - "name": "Spend - Signer 2", - "script": " <$(a2)> <$(b2)> <$(c1)>", - "unlocks": "lock" - }, - "unlock_3": { - "name": "Spend - Signer 3", - "script": " <$(a2)> <$(b1)> <$(c4)>", - "unlocks": "lock" - }, - "unlock_4": { - "name": "Spend - Signer 4", - "script": " <$(a2)> <$(b1)> <$(c3)>", - "unlocks": "lock" - }, - "unlock_5": { - "name": "Spend - Signer 5", - "script": " <$(a1)> <$(b4)> <$(c6)>", - "unlocks": "lock" - }, - "unlock_6": { - "name": "Spend - Signer 6", - "script": " <$(a1)> <$(b4)> <$(c5)>", - "unlocks": "lock" - }, - "unlock_7": { - "name": "Spend - Signer 7", - "script": " <$(a1)> <$(b3)> <$(c8)>", - "unlocks": "lock" - }, - "unlock_8": { - "name": "Spend - Signer 8", - "script": " <$(a1)> <$(b3)> <$(c7)>", - "unlocks": "lock" - } - }, - "supported": ["BCH_2019_11"], - "version": 0 -} diff --git a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json index 64e82091..a6e1d2b9 100644 --- a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json +++ b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json @@ -66,7 +66,7 @@ }, "scripts": { "lock": { - "lockingType": "p2sh", + "lockingType": "p2sh20", "name": "2-of-2 Recoverable Vault", "script": "OP_IF\n <$(\n \n OP_ADD\n )>\n OP_CHECKLOCKTIMEVERIFY OP_DROP\n \n OP_CHECKSIGVERIFY\n <1>\nOP_ELSE\n <2>\nOP_ENDIF\n <2>\nOP_CHECKMULTISIG" }, @@ -96,6 +96,6 @@ "unlocks": "lock" } }, - "supported": ["BCH_2019_11"], + "supported": ["BCH_2021_05", "BCH_2022_05"], "version": 0 } diff --git a/src/lib/transaction/fixtures/templates/2-of-3.json b/src/lib/transaction/fixtures/templates/2-of-3.json index c8edd191..02421097 100644 --- a/src/lib/transaction/fixtures/templates/2-of-3.json +++ b/src/lib/transaction/fixtures/templates/2-of-3.json @@ -47,11 +47,11 @@ "unlocks": "lock" }, "lock": { - "lockingType": "p2sh", + "lockingType": "p2sh20", "name": "2-of-3 Vault", "script": "OP_2\n\n\n\nOP_3\nOP_CHECKMULTISIG" } }, - "supported": ["BCH_2019_11"], + "supported": ["BCH_2021_05", "BCH_2022_05"], "version": 0 } diff --git a/src/lib/transaction/fixtures/templates/cash-channels.json b/src/lib/transaction/fixtures/templates/cash-channels.json index 6db1703b..3f70c9c7 100644 --- a/src/lib/transaction/fixtures/templates/cash-channels.json +++ b/src/lib/transaction/fixtures/templates/cash-channels.json @@ -1,23 +1,23 @@ { "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", - "description": "**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel which allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To “top up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.", + "description": "**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To “top up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.", "entities": { "owner_entity": { "description": "The owner of this channel. The owner can pre-sign authorizations or withdraw from the channel at any time.", "name": "Owner", "variables": { "authorized_amount": { - "description": "The value of the authorized payment in terms of the denominating asset encoded as a Script Number, e.g. `10000`.\n\nIf the denominating asset is BCH, this number is represented in satoshis. If the denominating asset is another currency, it should be represented in the smallest common decimal unit of that currency, e.g. for $100.00 \"USD\", this value should be `10000`. All fiat currencies must be represented with 2 decimal places, even for currencies where fractional units are not commonly used, e.g. IRR, VND, IDR.\n\nBecause this value is not operated upon by the locking script, if desired, the value may be encrypted (using a key shared by all entities) so the terms of authorizations are not publicly auditable.", + "description": "The value of the authorized payment in terms of the denominating asset encoded as a VM Number, e.g. `10000`.\n\nIf the denominating asset is BCH, this number is represented in satoshis. If the denominating asset is another currency, it should be represented in the smallest common decimal unit of that currency, e.g. for $100.00 \"USD\", this value should be `10000`. All fiat currencies must be represented with 2 decimal places, even for currencies where fractional units are not commonly used, e.g. IRR, VND, IDR.\n\nBecause this value is not operated upon by the locking script, if desired, the value may be encrypted (using a key shared by all entities) so the terms of authorizations are not publicly auditable.", "name": "Authorized Amount", "type": "AddressData" }, "denominating_asset": { - "description": "The asset in which the Authorized Amount is specified. This should be an identifier (like a currency code or ticker symbol) which is understood by each party, encoded as a UTF8Literal, e.g. `\"BCH\"`, `\"XAU\"`, or `\"USD\"`. \n\nIf desired, the value can be encrypted (using a key shared by all entities) so the exact terms of the transaction are not publicly auditable.", + "description": "The asset in which the Authorized Amount is specified. This should be an identifier (like a currency code or ticker symbol) that is understood by each party, encoded as a UTF8Literal, e.g. `\"BCH\"`, `\"XAU\"`, or `\"USD\"`. \n\nIf desired, the value can be encrypted (using a key shared by all entities) so the exact terms of the transaction are not publicly auditable.", "name": "Denominating Asset", "type": "AddressData" }, "maximum_authorized_satoshis": { - "description": "The maximum allowed satoshi value of a payment authorization, encoded as a Script Number, e.g. `10000`.\n\nIf the Denominating Asset is BCH, this is the exact value of the payment.\n\nIf the Denominating Asset is not BCH, the exact payment amount is chosen by the Rate Oracle (Payment Satoshis). If the rate has changed dramatically enough that the payment will exceed the Maximum Authorized Satoshis, the authorization is no longer valid, and the Owner must sign another authorization with a higher Maximum Authorized Satoshis value. The Owner should calculate this based on the percentage market price increase they're willing to continue allowing this authorization. E.g.: maximum_authorized_satoshis = current_estimated_satoshis * (1 + price_flexibility_percentage)", + "description": "The maximum allowed satoshi value of a payment authorization, encoded as a VM Number, e.g. `10000`.\n\nIf the Denominating Asset is BCH, this is the exact value of the payment.\n\nIf the Denominating Asset is not BCH, the exact payment amount is chosen by the Rate Oracle (Payment Satoshis). If the rate has changed dramatically enough that the payment will exceed the Maximum Authorized Satoshis, the authorization is no longer valid, and the Owner must sign another authorization with a higher Maximum Authorized Satoshis value. The Owner should calculate this based on the percentage market price increase they're willing to continue allowing this authorization. E.g.: maximum_authorized_satoshis = current_estimated_satoshis * (1 + price_flexibility_percentage)", "name": "Maximum Authorized Satoshis", "type": "AddressData" }, @@ -27,12 +27,12 @@ "type": "Key" }, "payment_number": { - "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a Script Number between 0 and 65534, e.g. `42`.", + "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.", "name": "Payment Number", "type": "AddressData" }, "payment_time": { - "description": "The planned Block Time at which an Authorization should become valid for spending. This is also the time at which the Rate Oracle (if present) should determine the Payment Satoshis.\n\nMust be encoded as a Script Number (of up to 5 bytes as is consumed by OP_CHECKLOCKTIMEVERIFY).", + "description": "The planned Block Time at which an Authorization should become valid for spending. This is also the time at which the Rate Oracle (if present) should determine the Payment Satoshis.\n\nMust be encoded as a VM Number (of up to 5 bytes as is consumed by OP_CHECKLOCKTIMEVERIFY).", "name": "Payment Time", "type": "AddressData" } @@ -92,6 +92,11 @@ }, "description": "An example attempting to execute a payment authorization before the payment time authorized by the owner. The authorization is for \"1000\" in asset \"USD\" (described in cents, so $10.00 USD), and it authorizes a payment of a maximum of 10500 satoshis. The hypothetical UTXO being spent has a value of 20000 satoshis.", "name": "$10.00 USD – Before Payment Time", + "sourceOutputs": [ + { + "valueSatoshis": 20000 + } + ], "transaction": { "locktime": 1577836800, "outputs": [ @@ -106,11 +111,10 @@ } } }, - "satoshis": 10000 + "valueSatoshis": 10000 } ] - }, - "value": 20000 + } }, "exceeds_maximum_payment_number": { "data": { @@ -136,55 +140,55 @@ }, "scripts": { "channel": { - "lockingType": "p2sh", + "lockingType": "p2sh20", "name": "Channel", "script": "\nOP_SWAP\nOP_IF\n /**\n * Execute Authorization\n */\n OP_DUP OP_TOALTSTACK // save owner.public_key\n\n /**\n * Reconstruct payment authorization message\n */\n <6> OP_PICK // channel_identifier\n <15> OP_PICK // payment_number_padded\n <7> OP_PICK // maximum_authorized_satoshis\n OP_DUP\n <12> OP_PICK // payment_satoshis\n OP_GREATERTHANOREQUAL OP_VERIFY // maximum_authorized_satoshis >= payment_satoshis\n <8> OP_NUM2BIN\n <7> OP_PICK <8> OP_NUM2BIN // authorized_amount\n <7> OP_PICK <8> OP_NUM2BIN // denominating_asset\n <7> OP_PICK <8> OP_NUM2BIN // payment_time\n OP_CAT OP_CAT\n OP_DUP OP_TOALTSTACK // save (authorized_amount + denominating_asset + payment_time)\n OP_CAT OP_CAT OP_CAT\n OP_SWAP \n\n OP_CHECKDATASIGVERIFY // check payment authorization signature\n\n OP_CHECKLOCKTIMEVERIFY // fail if not past payment_time\n OP_2DROP OP_2DROP\n\n <8> OP_PICK // payment_number_padded\n \n OP_EQUALVERIFY // check against payment_number in authorization\n\n // reconstruct rate_claim\n OP_FROMALTSTACK\n <3> OP_PICK // payment_satoshis\n <8> OP_NUM2BIN\n OP_CAT\n\n\n OP_SWAP\n OP_FROMALTSTACK // load owner.public_key\n \n OP_DUP\n OP_TOALTSTACK // save receiver.public_key\n OP_CAT\n OP_HASH160\n\n OP_EQUALVERIFY // verify channel_identifier\n\n \n OP_CHECKDATASIGVERIFY // verify rate_claim\n\n <7> OP_PICK // covered_bytecode_before_payment_number\n <7> OP_PICK // payment_number_padded\n OP_BIN2NUM\n <1> OP_ADD <2> OP_NUM2BIN // next payment_number\n <7> OP_PICK // covered_bytecode_after_payment_number\n OP_CAT OP_CAT \n OP_HASH160 // P2SH redeem bytecode hash\n \n /**\n * prefix locking bytecode with its length (required in serialization)\n */\n <23>\n \n OP_ROT\n \n OP_CAT OP_CAT // expected locking bytecode\n OP_CAT // length + locking bytecode\n\n // calculate expected output value\n <5> OP_PICK // outpoint_value\n OP_BIN2NUM\n OP_ROT\n OP_SUB <8> OP_NUM2BIN // remaining balance\n OP_SWAP OP_CAT // expected output serialization\n OP_SWAP OP_CAT\n\n /**\n * Verify signing serialization transaction outputs (uncomment for testing)\n */\n // OP_DUP OP_TOALTSTACK\n // <8> OP_PICK // signing_serialization.transaction_outputs\n // OP_EQUALVERIFY\n // OP_FROMALTSTACK\n /**\n * End signing serialization transaction outputs verification (uncomment for testing)\n */\n\n OP_HASH256 // expected transaction_outputs_hash\n OP_SWAP\n OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT\n\n /**\n * Verify full signing serialization (uncomment for testing)\n */\n // OP_DUP OP_TOALTSTACK\n // OP_EQUALVERIFY\n // OP_FROMALTSTACK\n /**\n * End full signing serialization verification (uncomment for testing)\n */\n \n OP_SHA256\n\n OP_FROMALTSTACK\n OP_DUP\n <3> OP_PICK // receiver.schnorr_signature.all_outputs\n OP_ROT\n OP_CHECKSIGVERIFY // signature covers transaction\n OP_ROT \n <64> OP_SPLIT OP_DROP // remove signature serialization type bit\n OP_ROT OP_ROT\n OP_CHECKDATASIG // signature covers expected transaction\nOP_ELSE\n // Owner Spend\n OP_CHECKSIG\nOP_ENDIF \n\n\n" }, "channel_components": { "name": "Channel Components", "script": "/**\n * This is just a convenience script to split the locking bytecode\n * at the location of \"payment_number_padded\". Since this is used in\n * several places, using a single script makes updates easier.\n **/\n // The raw locking bytecode of the current channel\n<78> OP_SPLIT // the location of payment_number_padded in channel\n<2> OP_SPLIT // the length of payment_number_padded", - "tests": [ - { + "tests": { + "contains_padded_payment_number": { "check": "/**\n * Here we confirm that we split the bytecode at the\n * correct indexes:\n * - item 1 should be the bytecode before payment_number_padded\n * - item 2 should be payment_number_padded\n * - item 3 should be the bytecode after payment_number_padded\n */\n\n<1> OP_PICK OP_TOALTSTACK\n\nOP_CAT OP_CAT OP_EQUALVERIFY\n\nOP_FROMALTSTACK OP_EQUAL", "name": "Contains Padded Payment Number", "passes": ["after_payment_time", "before_payment_time"] } - ] + } }, "channel_identifier": { "name": "Channel Identifier", "pushed": true, "script": "$(\n\nOP_CAT\nOP_HASH160)", - "tests": [ - { + "tests": { + "expected_id": { "check": "<0x564752b9f1c9f0246c8444a7f0a0ee8348f2e339>\nOP_EQUAL", "name": "Expected ID" } - ] + } }, "covered_bytecode_after_payment_number": { "name": "Covered Bytecode After Payment Number", "pushed": true, "script": "$(\n channel_components <0> OP_PICK\n OP_NIP OP_NIP OP_NIP\n)", - "tests": [ - { + "tests": { + "check_bytecode": { "check": "<0x886c537958807e7c6c2102e493dbf1c10d80f3581e4904930b1404cc6c13900ee0758474fa94abe8c4cd13766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac68>\nOP_EQUAL", "name": "Check Bytecode", "passes": ["test_bytecode_values"] } - ] + } }, "covered_bytecode_before_payment_number": { "name": "Covered Bytecode Before Payment Number", "pushed": true, "script": "$(\n channel_components <2> OP_PICK\n OP_NIP OP_NIP OP_NIP\n)", - "tests": [ - { + "tests": { + "check_bytecode": { "check": "<0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d587902>\nOP_EQUAL", "name": "Check Bytecode", "passes": ["test_bytecode_values"] } - ] + } }, "execute_authorization": { "fails": ["before_payment_time"], @@ -203,40 +207,40 @@ "name": "Payment Authorization", "pushed": true, "script": "$(\n \n \n <2> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n OP_CAT OP_CAT OP_CAT OP_CAT OP_CAT\n)", - "tests": [ - { + "tests": { + "check_format": { "check": "<0x564752b9f1c9f0246c8444a7f0a0ee8348f2e33902000429000000000000e803000000000000555344000000000080bf345e00000000>\nOP_EQUAL", "name": "Check Format", "passes": ["before_payment_time"] } - ] + } }, "payment_number_padded": { "name": "Payment Number Padded", "pushed": true, "script": "$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>", - "tests": [ - { + "tests": { + "requires_uint16": { "check": "<0x0200>\nOP_EQUAL", "fails": ["exceeds_maximum_payment_number"], "name": "Requires Uint16", "passes": ["before_payment_time"] } - ] + } }, "rate_claim": { "name": "Rate Claim", "pushed": true, "script": "$(\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n \n <8> OP_NUM2BIN\n OP_CAT\n OP_CAT\n OP_CAT\n)", - "tests": [ - { + "tests": { + "check_format": { "check": "<\n 0xe803000000000000\n 0x5553440000000000\n 0x80bf345e00000000\n 0x1027000000000000\n>\nOP_EQUAL", "name": "Check Format", "passes": ["after_payment_time"] } - ] + } } }, - "supported": ["BCH_2019_05", "BCH_2019_11"], + "supported": ["BCH_2022_05"], "version": 0 } diff --git a/src/lib/transaction/fixtures/templates/p2pkh.json b/src/lib/transaction/fixtures/templates/p2pkh.json index fb22672c..b80e0791 100644 --- a/src/lib/transaction/fixtures/templates/p2pkh.json +++ b/src/lib/transaction/fixtures/templates/p2pkh.json @@ -1,9 +1,9 @@ { "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", - "description": "A standard single-factor authentication template which uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports an \"Observer (Watch-Only)\" entity.", + "description": "A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports an \"Observer (Watch-Only)\" entity.", "entities": { "observer": { - "description": "An entity which can generate addresses but cannot spend funds from this wallet.", + "description": "An entity that can generate addresses but cannot spend funds from this wallet.", "name": "Observer (Watch-Only)", "scripts": ["lock"] }, @@ -13,7 +13,7 @@ "scripts": ["lock", "unlock"], "variables": { "key": { - "description": "The private key which controls this wallet.", + "description": "The private key that controls this wallet.", "name": "Key", "type": "HdKey" } diff --git a/src/lib/transaction/fixtures/templates/sig-of-sig.json b/src/lib/transaction/fixtures/templates/sig-of-sig.json index a7410c81..82379667 100644 --- a/src/lib/transaction/fixtures/templates/sig-of-sig.json +++ b/src/lib/transaction/fixtures/templates/sig-of-sig.json @@ -1,6 +1,6 @@ { "name": "Sig-of-Sig Vault (2-of-2)", - "description": "An unusual example of a template which must be signed in a specific order: Second Signer may only sign after First Signer.", + "description": "An unusual example of a template that must be signed in a specific order: Second Signer may only sign after First Signer. This construction could be useful in scenarios where a particular signing order must be guaranteed, e.g. proving that a \"most-responsible\" party only signed for a transaction knowing they were the final signer.", "entities": { "signer_1": { "name": "First Signer", @@ -24,7 +24,7 @@ "script": "first.signature.all_outputs" }, "lock": { - "lockingType": "p2sh", + "lockingType": "p2sh20", "name": "Sig-of-Sig Vault", "script": "OP_2 OP_PICK OP_CHECKDATASIGVERIFY OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG" }, @@ -33,6 +33,6 @@ "unlocks": "lock" } }, - "supported": ["BCH_2019_11"], + "supported": ["BCH_2021_05", "BCH_2022_05"], "version": 0 } diff --git a/src/lib/transaction/generate-transaction.spec.ts b/src/lib/transaction/generate-transaction.spec.ts index bb5c7b6a..efb6d730 100644 --- a/src/lib/transaction/generate-transaction.spec.ts +++ b/src/lib/transaction/generate-transaction.spec.ts @@ -1,18 +1,17 @@ -/* eslint-disable functional/no-expression-statement */ - import test from 'ava'; +import { privkey } from '../compiler/compiler-bch/compiler-bch.e2e.spec.helper.js'; +import type { TransactionCommon } from '../lib'; import { authenticationTemplateToCompilerBCH, bigIntToBinUint64LE, CashAddressNetworkPrefix, - decodeTransaction, + decodeTransactionCommon, generateTransaction, hexToBin, + importAuthenticationTemplate, lockingBytecodeToCashAddress, - validateAuthenticationTemplate, -} from '../lib'; -import { privkey } from '../template/compiler-bch/compiler-bch.e2e.spec.helper'; +} from '../lib.js'; const maybeP2pkhTemplate: unknown = { entities: { @@ -21,7 +20,7 @@ const maybeP2pkhTemplate: unknown = { scripts: ['lock', 'unlock'], variables: { owner: { - description: 'The private key which controls this wallet.', + description: 'The private key that controls this wallet.', name: "Owner's Key", type: 'Key', }, @@ -48,17 +47,18 @@ const maybeP2pkhTemplate: unknown = { version: 0, }; -test('createCompilerBCH: generateTransaction', async (t) => { - const p2pkhTemplate = validateAuthenticationTemplate(maybeP2pkhTemplate); +test.failing('createCompilerBCH: generateTransaction', (t) => { + const p2pkhTemplate = importAuthenticationTemplate(maybeP2pkhTemplate); if (typeof p2pkhTemplate === 'string') { t.fail(p2pkhTemplate); return; } - const p2pkh = await authenticationTemplateToCompilerBCH(p2pkhTemplate); - const lockingBytecode = p2pkh.generateBytecode('lock', { - keys: { privateKeys: { owner: privkey } }, + const p2pkh = authenticationTemplateToCompilerBCH(p2pkhTemplate); + const lockingBytecode = p2pkh.generateBytecode({ + data: { keys: { privateKeys: { owner: privkey } } }, + scriptId: 'lock', }); if (!lockingBytecode.success) { @@ -79,7 +79,7 @@ test('createCompilerBCH: generateTransaction', async (t) => { '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' ); - const satoshis = 1000000; + const valueSatoshis = 1000000; const result = generateTransaction({ inputs: [ { @@ -91,8 +91,8 @@ test('createCompilerBCH: generateTransaction', async (t) => { data: { keys: { privateKeys: { owner: privkey } }, }, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), script: 'unlock', + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), }, }, ], @@ -103,7 +103,7 @@ test('createCompilerBCH: generateTransaction', async (t) => { compiler: p2pkh, script: 'celebrate', }, - satoshis: bigIntToBinUint64LE(BigInt(0)), + valueSatoshis: bigIntToBinUint64LE(BigInt(0)), }, ], version: 2, @@ -117,10 +117,10 @@ test('createCompilerBCH: generateTransaction', async (t) => { t.deepEqual(result, { success: true, - transaction: decodeTransaction( + transaction: decodeTransactionCommon( hexToBin( '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' ) - ), + ) as TransactionCommon, }); }); diff --git a/src/lib/transaction/generate-transaction.ts b/src/lib/transaction/generate-transaction.ts index 142c08b5..4780847b 100644 --- a/src/lib/transaction/generate-transaction.ts +++ b/src/lib/transaction/generate-transaction.ts @@ -1,36 +1,29 @@ -import { CompilationData, Compiler } from '../template/compiler-types'; -import { - CompilationError, - CompilationResultParseError, - CompilationResultReduceError, - CompilationResultResolveError, -} from '../template/language/language-types'; import { allErrorsAreRecoverable, extractResolvedVariableBytecodeMap, -} from '../template/language/language-utils'; - -import { - encodeOutpoints, - encodeOutput, - encodeOutputsForSigning, - encodeSequenceNumbersForSigning, -} from './transaction-serialization'; -import { +} from '../language/language.js'; +import type { + AnyCompilerConfiguration, BytecodeGenerationCompletionInput, BytecodeGenerationCompletionOutput, BytecodeGenerationErrorBase, BytecodeGenerationErrorLocking, BytecodeGenerationErrorUnlocking, + CompilationContextBCH, + CompilationData, + CompilationError, + CompilationResultParseError, + CompilationResultReduceError, + CompilationResultResolveError, + Compiler, Input, InputTemplate, Output, OutputTemplate, - TransactionContextCommon, TransactionGenerationAttempt, TransactionGenerationError, TransactionTemplateFixed, -} from './transaction-types'; +} from '../lib'; const returnFailedCompilationDirective = < Type extends 'locking' | 'unlocking' @@ -42,97 +35,97 @@ const returnFailedCompilationDirective = < index: number; result: | CompilationResultParseError - | CompilationResultResolveError - | CompilationResultReduceError; + | CompilationResultReduceError + | CompilationResultResolveError; type: Type; -}) => { - return { - errors: result.errors.map((error) => ({ - ...error, - error: `Failed compilation of ${type} directive at index "${index}": ${error.error}`, - })), - index, - ...(result.errorType === 'parse' ? {} : { resolved: result.resolve }), - type, - }; -}; +}) => ({ + errors: result.errors.map((error) => ({ + ...error, + error: `Failed compilation of ${type} directive at index "${index}": ${error.error}`, + })), + index, + ...(result.errorType === 'parse' ? {} : { resolved: result.resolve }), + type, +}); export const compileOutputTemplate = < - CompilerType extends Compiler + CompilerType extends Compiler< + unknown, + AnyCompilerConfiguration, + unknown + > >({ outputTemplate, index, }: { outputTemplate: OutputTemplate; index: number; -}): Output | BytecodeGenerationErrorLocking => { +}): BytecodeGenerationErrorLocking | Output => { if ('script' in outputTemplate.lockingBytecode) { const directive = outputTemplate.lockingBytecode; const data = directive.data === undefined ? {} : directive.data; - const result = directive.compiler.generateBytecode( - directive.script, + const result = directive.compiler.generateBytecode({ data, - true - ); + debug: true, + scriptId: directive.script, + }); return result.success ? { lockingBytecode: result.bytecode, - satoshis: outputTemplate.satoshis, + valueSatoshis: outputTemplate.valueSatoshis, } : returnFailedCompilationDirective({ index, result, type: 'locking' }); } return { lockingBytecode: outputTemplate.lockingBytecode.slice(), - satoshis: outputTemplate.satoshis, + valueSatoshis: outputTemplate.valueSatoshis, }; }; export const compileInputTemplate = < - CompilerType extends Compiler + CompilerType extends Compiler< + CompilationContext, + AnyCompilerConfiguration, + unknown + >, + CompilationContext extends CompilationContextBCH = CompilationContextBCH >({ inputTemplate, index, - outputs, template, - transactionOutpoints, - transactionSequenceNumbers, }: { inputTemplate: InputTemplate; index: number; outputs: Output[]; template: Readonly>; - transactionOutpoints: Uint8Array; - transactionSequenceNumbers: Uint8Array; -}): Input | BytecodeGenerationErrorUnlocking => { +}): BytecodeGenerationErrorUnlocking | Input => { if ('script' in inputTemplate.unlockingBytecode) { const directive = inputTemplate.unlockingBytecode; - const correspondingOutput = outputs[index] as Output | undefined; - const result = directive.compiler.generateBytecode( - directive.script, - { + const result = directive.compiler.generateBytecode({ + data: { ...directive.data, - transactionContext: { - correspondingOutput: - correspondingOutput === undefined - ? undefined - : encodeOutput(correspondingOutput), - locktime: template.locktime, - outpointIndex: inputTemplate.outpointIndex, - outpointTransactionHash: inputTemplate.outpointTransactionHash.slice(), - outputValue: directive.satoshis, - sequenceNumber: inputTemplate.sequenceNumber, - transactionOutpoints: transactionOutpoints.slice(), - transactionOutputs: encodeOutputsForSigning(outputs), - transactionSequenceNumbers: transactionSequenceNumbers.slice(), - version: template.version, - }, + /** + * TODO: skipped during refactor – fix when migrating to PST format/workflow + */ + compilationContext: { + inputIndex: index, + sourceOutputs: [], + transaction: { + inputs: [], + locktime: template.locktime, + outputs: [], + version: template.version, + }, + } as unknown as CompilationContext, }, - true - ); + debug: true, + scriptId: directive.script, + }); return result.success ? { outpointIndex: inputTemplate.outpointIndex, - outpointTransactionHash: inputTemplate.outpointTransactionHash.slice(), + outpointTransactionHash: + inputTemplate.outpointTransactionHash.slice(), sequenceNumber: inputTemplate.sequenceNumber, unlockingBytecode: result.bytecode, } @@ -152,7 +145,7 @@ export const compileInputTemplate = < * * Returns either a `Transaction` or an array of compilation errors. * - * For each `CompilationDirective`, the `transactionContext` property will be + * For each `CompilationDirective`, the `compilationContext` property will be * automatically provided to the compiler. All other necessary `CompilationData` * properties must be specified in the `TransactionTemplate`. * @@ -160,7 +153,8 @@ export const compileInputTemplate = < * `Transaction` */ export const generateTransaction = < - CompilerType extends Compiler + // eslint-disable-next-line @typescript-eslint/no-explicit-any + CompilerType extends Compiler, any> >( template: Readonly> ): TransactionGenerationAttempt => { @@ -195,23 +189,12 @@ export const generateTransaction = < } const outputs = outputResults as Output[]; - const inputSerializationElements = template.inputs.map((inputTemplate) => ({ - outpointIndex: inputTemplate.outpointIndex, - outpointTransactionHash: inputTemplate.outpointTransactionHash.slice(), - sequenceNumber: inputTemplate.sequenceNumber, - })); - const transactionOutpoints = encodeOutpoints(inputSerializationElements); - const transactionSequenceNumbers = encodeSequenceNumbersForSigning( - inputSerializationElements - ); const inputResults = template.inputs.map((inputTemplate, index) => compileInputTemplate({ index, inputTemplate, outputs, template, - transactionOutpoints, - transactionSequenceNumbers, }) ); @@ -276,7 +259,7 @@ export const extractResolvedVariables = ( * TODO: fundamentally unsound, migrate to PST format * * Given an unsuccessful transaction generation result, extract a map of the - * identifiers missing from the compilation mapped to the entity which owns each + * identifiers missing from the compilation mapped to the entity that owns each * variable. * * Returns `false` if any errors are fatal (the error either cannot be resolved @@ -289,9 +272,9 @@ export const extractResolvedVariables = ( export const extractMissingVariables = ( transactionGenerationError: TransactionGenerationError ) => { - const allErrors = (transactionGenerationError.errors as BytecodeGenerationErrorBase[]).reduce< - CompilationError[] - >((all, error) => [...all, ...error.errors], []); + const allErrors = ( + transactionGenerationError.errors as BytecodeGenerationErrorBase[] + ).reduce((all, error) => [...all, ...error.errors], []); if (!allErrorsAreRecoverable(allErrors)) { return false; @@ -333,28 +316,24 @@ export const extractMissingVariables = ( * The first compilation must use only trusted compilation data */ export const safelyExtendCompilationData = < - TransactionContext = TransactionContextCommon + CompilationContext = CompilationContextBCH >( transactionGenerationError: TransactionGenerationError, - trustedCompilationData: CompilationData, + trustedCompilationData: CompilationData, untrustedResolutions: { [providedByEntityId: string]: ReturnType; } -): false | CompilationData => { +): CompilationData | false => { const missing = extractMissingVariables(transactionGenerationError); if (missing === false) return false; const selectedResolutions = Object.entries(missing).reduce<{ [fullIdentifier: string]: Uint8Array; }>((all, [identifier, entityId]) => { - const entityResolution = untrustedResolutions[entityId] as - | { - [fullIdentifier: string]: Uint8Array; - } - | undefined; + const entityResolution = untrustedResolutions[entityId]; if (entityResolution === undefined) { return all; } - const resolution = entityResolution[identifier] as Uint8Array | undefined; + const resolution = entityResolution[identifier]; if (resolution === undefined) { return all; } diff --git a/src/lib/transaction/transaction-e2e.1-of-8-tree.spec.ts b/src/lib/transaction/transaction-e2e.1-of-8-tree.spec.ts deleted file mode 100644 index ee788d76..00000000 --- a/src/lib/transaction/transaction-e2e.1-of-8-tree.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable functional/no-expression-statement, camelcase, @typescript-eslint/naming-convention */ - -import test from 'ava'; - -import { - authenticationTemplateToCompilerBCH, - CompilationData, - stringify, - validateAuthenticationTemplate, -} from '../lib'; - -import { - hdPublicKey0H, - hdPublicKey1H, - hdPublicKey2H, - hdPublicKey3H, - hdPublicKey4H, - hdPublicKey5H, - hdPublicKey6H, - hdPublicKey7H, - oneOfEightTreeJson, -} from './transaction-e2e.spec.helper'; - -test('transaction e2e tests: 1-of-8 Tree Signature (fails)', async (t) => { - const template = validateAuthenticationTemplate(oneOfEightTreeJson); - if (typeof template === 'string') { - t.fail(stringify(template)); - return; - } - - /** - * The HD public keys shared between the entities at wallet creation time - */ - const hdPublicKeys = { - signer_1: hdPublicKey0H, - signer_2: hdPublicKey1H, - signer_3: hdPublicKey2H, - signer_4: hdPublicKey3H, - signer_5: hdPublicKey4H, - signer_6: hdPublicKey5H, - signer_7: hdPublicKey6H, - signer_8: hdPublicKey7H, - }; - - const lockingData: CompilationData = { - hdKeys: { addressIndex: 0, hdPublicKeys }, - }; - - const lockingScript = 'lock'; - const compiler = await authenticationTemplateToCompilerBCH(template); - const lockingBytecode = compiler.generateBytecode(lockingScript, lockingData); - - t.false(lockingBytecode.success, stringify(lockingBytecode)); -}); diff --git a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts index 73302e17..d2bb5ec1 100644 --- a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts @@ -1,26 +1,28 @@ -/* eslint-disable functional/no-expression-statement, camelcase, @typescript-eslint/naming-convention */ +/* eslint-disable camelcase */ import test from 'ava'; +import type { + BytecodeGenerationCompletionInput, + CompilationData, + TransactionCommon, +} from '../lib'; import { authenticationTemplateToCompilerBCH, bigIntToBinUint64LE, - BytecodeGenerationCompletionInput, CashAddressNetworkPrefix, - CompilationData, - compileBtl, + compileCashAssembly, + createVirtualMachineBCH, dateToLocktime, - decodeTransaction, - encodeTransaction, + decodeTransactionCommon, + encodeTransactionCommon, extractMissingVariables, generateTransaction, hexToBin, - instantiateVirtualMachineBCH, + importAuthenticationTemplate, lockingBytecodeToCashAddress, stringify, - validateAuthenticationTemplate, - verifyTransaction, -} from '../lib'; +} from '../lib.js'; import { hdPrivateKey0H, @@ -30,13 +32,13 @@ import { hdPublicKey1H, hdPublicKey2H, twoOfTwoRecoverableJson, -} from './transaction-e2e.spec.helper'; +} from './transaction-e2e.spec.helper.js'; -const vmPromise = instantiateVirtualMachineBCH(); +const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity -test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { - const template = validateAuthenticationTemplate(twoOfTwoRecoverableJson); +test.failing('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { + const template = importAuthenticationTemplate(twoOfTwoRecoverableJson); if (typeof template === 'string') { t.fail(template); return; @@ -54,21 +56,26 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { const creationDate = dateToLocktime( new Date('2020-01-01T00:00:00.000Z') ) as number; - // eslint-disable-next-line @typescript-eslint/no-magic-numbers + const threeMonths = 60 * 60 * 24 * 90; const locktimeFourMonthsLater = dateToLocktime( new Date('2020-04-01T00:00:00.000Z') ) as number; const lockingData: CompilationData = { - bytecode: { delay_seconds: compileBtl(`${threeMonths}`) as Uint8Array }, + bytecode: { + delay_seconds: compileCashAssembly(`${threeMonths}`) as Uint8Array, + }, currentBlockTime: creationDate, hdKeys: { addressIndex: 0, hdPublicKeys }, }; const lockingScript = 'lock'; - const compiler = await authenticationTemplateToCompilerBCH(template); - const lockingBytecode = compiler.generateBytecode(lockingScript, lockingData); + const compiler = authenticationTemplateToCompilerBCH(template); + const lockingBytecode = compiler.generateBytecode({ + data: lockingData, + scriptId: lockingScript, + }); if (!lockingBytecode.success) { t.log('lockingBytecode', stringify(lockingBytecode)); @@ -83,15 +90,15 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { t.deepEqual(address, 'bchtest:pz8p649zg3a492hxy86sh0ccvc7sptrlx5cp3eapah'); - const satoshis = 10000; + const valueSatoshis = 10000; const utxoOutput1 = { lockingBytecode: lockingBytecode.bytecode, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), }; const utxoOutput2 = { lockingBytecode: lockingBytecode.bytecode, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), }; /** @@ -105,8 +112,8 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { sequenceNumber: 0, unlockingBytecode: { compiler, - satoshis: utxoOutput1.satoshis, script: 'spend', + valueSatoshis: utxoOutput1.valueSatoshis, }, }; @@ -121,8 +128,8 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { sequenceNumber: 0, unlockingBytecode: { compiler, - satoshis: utxoOutput2.satoshis, script: 'recover_1', + valueSatoshis: utxoOutput2.valueSatoshis, }, }; @@ -131,7 +138,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { outputs: [ { lockingBytecode: hexToBin('6a0b68656c6c6f20776f726c64'), - satoshis: bigIntToBinUint64LE(BigInt(0)), + valueSatoshis: bigIntToBinUint64LE(BigInt(0)), }, ], version: 2, @@ -267,9 +274,8 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { return; } - const signer2Attempt2MissingVariables = extractMissingVariables( - signer2Attempt2 - ); + const signer2Attempt2MissingVariables = + extractMissingVariables(signer2Attempt2); t.deepEqual(signer2Attempt2MissingVariables, { 'trusted.signature.all_outputs': 'trusted_party', @@ -292,8 +298,9 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { stringify(signer2Attempt2.completions) ); - const completedInput1 = (signer2Attempt2 - .completions[0] as BytecodeGenerationCompletionInput).input; + const completedInput1 = ( + signer2Attempt2.completions[0] as BytecodeGenerationCompletionInput + ).input; /** * Signer 3 adds their signature, pulling in the completed first input @@ -356,11 +363,9 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { } const { transaction } = successfulCompilation; - const vm = await vmPromise; - const result = verifyTransaction({ - spentOutputs: [utxoOutput1, utxoOutput2], + const result = vm.verify({ + sourceOutputs: [utxoOutput1, utxoOutput2], transaction, - vm, }); t.true(result, stringify(result)); @@ -368,17 +373,17 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', async (t) => { successfulCompilation, { success: true, - transaction: decodeTransaction( + transaction: decodeTransactionCommon( /** * tx: e6c808adcb3cfc06461e962373659554bf6c447ea7b25ac503ff429e21050755 */ hexToBin( '02000000026aa4ae7249c4cfb91481dd294cda4ce1aeaccfe5e146ef4fdf8447d2f5cb686100000000fd09010047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000007cd9658128e3dec8bf5f9c222bb3622808f31c299ae859bad8ad1de7170ee50c01000000fd0a0100473044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841483045022100d62f54380b58b99677467a4016fceffd1cd85adabe6d2ffffab61a7e599dc5d302207a43e7809e5afae5069cef08d5f4960adcb9d245d295bbdf6bb8ab9a9056d11441514c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000000100000000000000000d6a0b68656c6c6f20776f726c6480d9835e' ) - ), + ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransaction(successfulCompilation.transaction) + encodeTransactionCommon(successfulCompilation.transaction) )}` ); }); diff --git a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts index c422ae33..36f940f6 100644 --- a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts @@ -1,25 +1,24 @@ -/* eslint-disable functional/no-expression-statement, camelcase, @typescript-eslint/naming-convention */ +/* eslint-disable camelcase */ import test from 'ava'; +import type { CompilationData, TransactionCommon } from '../lib'; import { authenticationTemplateToCompilerBCH, bigIntToBinUint64LE, CashAddressNetworkPrefix, - CompilationData, - decodeTransaction, - encodeTransaction, + createVirtualMachineBCH, + decodeTransactionCommon, + encodeTransactionCommon, extractMissingVariables, extractResolvedVariables, generateTransaction, hexToBin, - instantiateVirtualMachineBCH, + importAuthenticationTemplate, lockingBytecodeToCashAddress, safelyExtendCompilationData, stringify, - validateAuthenticationTemplate, - verifyTransaction, -} from '../lib'; +} from '../lib.js'; import { hdPrivateKey0H, @@ -28,13 +27,13 @@ import { hdPublicKey1H, hdPublicKey2H, twoOfThreeJson, -} from './transaction-e2e.spec.helper'; +} from './transaction-e2e.spec.helper.js'; -const vmPromise = instantiateVirtualMachineBCH(); +const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity -test('transaction e2e tests: 2-of-3 multisig', async (t) => { - const template = validateAuthenticationTemplate(twoOfThreeJson); +test.failing('transaction e2e tests: 2-of-3 multisig', (t) => { + const template = importAuthenticationTemplate(twoOfThreeJson); if (typeof template === 'string') { t.fail(template); return; @@ -54,8 +53,11 @@ test('transaction e2e tests: 2-of-3 multisig', async (t) => { }; const lockingScript = 'lock'; - const compiler = await authenticationTemplateToCompilerBCH(template); - const lockingBytecode = compiler.generateBytecode(lockingScript, lockingData); + const compiler = authenticationTemplateToCompilerBCH(template); + const lockingBytecode = compiler.generateBytecode({ + data: lockingData, + scriptId: lockingScript, + }); if (!lockingBytecode.success) { t.log('lockingBytecode', stringify(lockingBytecode)); @@ -70,10 +72,10 @@ test('transaction e2e tests: 2-of-3 multisig', async (t) => { t.deepEqual(address, 'bchtest:pplldqjpjaj0058xma6csnpgxd9ew2vxgv26n639yk'); - const satoshis = 10000; + const valueSatoshis = 10000; const utxoOutput = { lockingBytecode: lockingBytecode.bytecode, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), }; const input1 = { @@ -84,8 +86,8 @@ test('transaction e2e tests: 2-of-3 multisig', async (t) => { sequenceNumber: 0, unlockingBytecode: { compiler, - satoshis: utxoOutput.satoshis, script: '1_and_3', + valueSatoshis: utxoOutput.valueSatoshis, }, }; @@ -94,7 +96,7 @@ test('transaction e2e tests: 2-of-3 multisig', async (t) => { outputs: [ { lockingBytecode: hexToBin('6a0b68656c6c6f20776f726c64'), - satoshis: bigIntToBinUint64LE(BigInt(0)), + valueSatoshis: bigIntToBinUint64LE(BigInt(0)), }, ], version: 2, @@ -219,29 +221,24 @@ test('transaction e2e tests: 2-of-3 multisig', async (t) => { } const { transaction } = successfulCompilation; - const vm = await vmPromise; - const result = verifyTransaction({ - spentOutputs: [utxoOutput], - transaction, - vm, - }); + const result = vm.verify({ sourceOutputs: [utxoOutput], transaction }); t.true(result, stringify(result)); t.deepEqual( successfulCompilation, { success: true, - transaction: decodeTransaction( + transaction: decodeTransactionCommon( /** * tx: c903aba46b4069e485b51292fd68eefdc95110fb95461b118c650fb454c34a9c */ hexToBin( '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' ) - ), + ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransaction(successfulCompilation.transaction) + encodeTransactionCommon(successfulCompilation.transaction) )}` ); }); diff --git a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts index 385f077e..384d0c5b 100644 --- a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts +++ b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts @@ -1,106 +1,110 @@ -/* eslint-disable functional/no-expression-statement */ - import test from 'ava'; +import type { CompilationData, TransactionCommon } from '../lib'; import { authenticationTemplateToCompilerBCH, bigIntToBinUint64LE, CashAddressNetworkPrefix, - CompilationData, - decodeTransaction, + decodeTransactionCommon, generateTransaction, hexToBin, + importAuthenticationTemplate, lockingBytecodeToCashAddress, - validateAuthenticationTemplate, -} from '../lib'; +} from '../lib.js'; import { hdPrivateKey, hdPublicKey, p2pkhJson, -} from './transaction-e2e.spec.helper'; +} from './transaction-e2e.spec.helper.js'; -test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', async (t) => { - const template = validateAuthenticationTemplate(p2pkhJson); - if (typeof template === 'string') { - t.fail(template); - return; - } +test.failing( + 'transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', + (t) => { + const template = importAuthenticationTemplate(p2pkhJson); + if (typeof template === 'string') { + t.fail(template); + return; + } - const lockingScript = 'lock'; + const lockingScript = 'lock'; - /** - * Available to observer - */ - const lockingData: CompilationData = { - hdKeys: { addressIndex: 0, hdPublicKeys: { owner: hdPublicKey } }, - }; + /** + * Available to observer + */ + const lockingData: CompilationData = { + hdKeys: { addressIndex: 0, hdPublicKeys: { owner: hdPublicKey } }, + }; - /** - * Only available to owner - */ - const unlockingData: CompilationData = { - hdKeys: { addressIndex: 0, hdPrivateKeys: { owner: hdPrivateKey } }, - }; + /** + * Only available to owner + */ + const unlockingData: CompilationData = { + hdKeys: { addressIndex: 0, hdPrivateKeys: { owner: hdPrivateKey } }, + }; - const compiler = await authenticationTemplateToCompilerBCH(template); - const lockingBytecode = compiler.generateBytecode(lockingScript, lockingData); + const compiler = authenticationTemplateToCompilerBCH(template); + const lockingBytecode = compiler.generateBytecode({ + data: lockingData, + scriptId: lockingScript, + }); - if (!lockingBytecode.success) { - t.log(lockingBytecode.errors); - t.fail(); - return; - } + if (!lockingBytecode.success) { + t.log(lockingBytecode.errors); + t.fail(); + return; + } - t.deepEqual( - lockingBytecodeToCashAddress( - lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet - ), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' - ); + t.deepEqual( + lockingBytecodeToCashAddress( + lockingBytecode.bytecode, + CashAddressNetworkPrefix.testnet + ), + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + ); - const utxoOutpointTransactionHash = hexToBin( - '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' - ); + const utxoOutpointTransactionHash = hexToBin( + '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' + ); - const satoshis = 1000000; - const result = generateTransaction({ - inputs: [ - { - outpointIndex: 1, - outpointTransactionHash: utxoOutpointTransactionHash, - sequenceNumber: 0, - unlockingBytecode: { - compiler, - data: unlockingData, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), - script: 'unlock', + const satoshis = 1000000; + const result = generateTransaction({ + inputs: [ + { + outpointIndex: 1, + outpointTransactionHash: utxoOutpointTransactionHash, + sequenceNumber: 0, + unlockingBytecode: { + compiler, + data: unlockingData, + script: 'unlock', + valueSatoshis: bigIntToBinUint64LE(BigInt(satoshis)), + }, }, - }, - ], - locktime: 0, - outputs: [ - { - lockingBytecode: hexToBin('6a0b68656c6c6f20776f726c64'), - satoshis: bigIntToBinUint64LE(BigInt(0)), - }, - ], - version: 2, - }); + ], + locktime: 0, + outputs: [ + { + lockingBytecode: hexToBin('6a0b68656c6c6f20776f726c64'), + valueSatoshis: bigIntToBinUint64LE(BigInt(0)), + }, + ], + version: 2, + }); - if (!result.success) { - t.log(result.errors); - t.fail(); - return; - } + if (!result.success) { + t.log(result.errors); + t.fail(); + return; + } - t.deepEqual(result, { - success: true, - transaction: decodeTransaction( - hexToBin( - '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) - ), - }); -}); + t.deepEqual(result, { + success: true, + transaction: decodeTransactionCommon( + hexToBin( + '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' + ) + ) as TransactionCommon, + }); + } +); diff --git a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts index 7efb5d25..fdf47a3f 100644 --- a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts +++ b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts @@ -1,24 +1,23 @@ -/* eslint-disable functional/no-expression-statement, camelcase, @typescript-eslint/naming-convention */ +/* eslint-disable camelcase */ import test from 'ava'; +import type { CompilationData, TransactionCommon } from '../lib'; import { authenticationTemplateToCompilerBCH, bigIntToBinUint64LE, CashAddressNetworkPrefix, - CompilationData, - decodeTransaction, - encodeTransaction, + createVirtualMachineBCH, + decodeTransactionCommon, + encodeTransactionCommon, extractMissingVariables, extractResolvedVariables, generateTransaction, hexToBin, - instantiateVirtualMachineBCH, + importAuthenticationTemplate, lockingBytecodeToCashAddress, stringify, - validateAuthenticationTemplate, - verifyTransaction, -} from '../lib'; +} from '../lib.js'; import { hdPrivateKey0H, @@ -26,13 +25,13 @@ import { hdPublicKey0H, hdPublicKey1H, sigOfSigJson, -} from './transaction-e2e.spec.helper'; +} from './transaction-e2e.spec.helper.js'; -const vmPromise = instantiateVirtualMachineBCH(); +const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity -test('transaction e2e tests: Sig-of-Sig Example', async (t) => { - const template = validateAuthenticationTemplate(sigOfSigJson); +test.failing('transaction e2e tests: Sig-of-Sig Example', (t) => { + const template = importAuthenticationTemplate(sigOfSigJson); if (typeof template === 'string') { t.fail(stringify(template)); return; @@ -51,8 +50,11 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { }; const lockingScript = 'lock'; - const compiler = await authenticationTemplateToCompilerBCH(template); - const lockingBytecode = compiler.generateBytecode(lockingScript, lockingData); + const compiler = authenticationTemplateToCompilerBCH(template); + const lockingBytecode = compiler.generateBytecode({ + data: lockingData, + scriptId: lockingScript, + }); if (!lockingBytecode.success) { t.log('lockingBytecode', stringify(lockingBytecode)); @@ -67,10 +69,10 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { t.deepEqual(address, 'bchtest:ppcvyjuqwhuz06np4us443l26dzck305psl0dw6as9'); - const satoshis = 10000; + const valueSatoshis = 10000; const utxoOutput = { lockingBytecode: lockingBytecode.bytecode, - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), }; const input = { @@ -81,8 +83,8 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { sequenceNumber: 0, unlockingBytecode: { compiler, - satoshis: utxoOutput.satoshis, script: 'spend', + valueSatoshis: utxoOutput.valueSatoshis, }, }; @@ -91,7 +93,7 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { outputs: [ { lockingBytecode: hexToBin('6a0b68656c6c6f20776f726c64'), - satoshis: bigIntToBinUint64LE(BigInt(0)), + valueSatoshis: bigIntToBinUint64LE(BigInt(0)), }, ], version: 2, @@ -214,12 +216,7 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { } const { transaction } = successfulCompilation; - const vm = await vmPromise; - const result = verifyTransaction({ - spentOutputs: [utxoOutput], - transaction, - vm, - }); + const result = vm.verify({ sourceOutputs: [utxoOutput], transaction }); t.true(result, stringify(result)); t.deepEqual( @@ -229,14 +226,14 @@ test('transaction e2e tests: Sig-of-Sig Example', async (t) => { /** * tx: 47623fba38548005eb8e5773a288d3fa5898b80178e94296f7b9f82ee053560c */ - transaction: decodeTransaction( + transaction: decodeTransactionCommon( hexToBin( '020000000101dac7454c08a6247f45ebda80ebb6b6dfd4acb2041f46e23dc23807953f3c1a01000000f04730440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e4658846304402201673c0f6e8741bf2fd259411c212a2d7e326fe4c238118c0dbcab662ef439de10220259d9cf3414f662b83f5d7210e5b5890cdb64ee7e36f2187e6377c9e88a484613e52792102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b8469545bb76a91433c4f1d1e60cbe8eda7cf976752bbb313780c7db88ac000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' ) - ), + ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransaction(successfulCompilation.transaction) + encodeTransactionCommon(successfulCompilation.transaction) )}` ); }); diff --git a/src/lib/transaction/transaction-e2e.spec.helper.ts b/src/lib/transaction/transaction-e2e.spec.helper.ts index cc218b67..a101b48e 100644 --- a/src/lib/transaction/transaction-e2e.spec.helper.ts +++ b/src/lib/transaction/transaction-e2e.spec.helper.ts @@ -1,12 +1,11 @@ -import * as oneOfEightTreeJson from './fixtures/templates/1-of-8-tree.json'; -import * as twoOfTwoRecoverableJson from './fixtures/templates/2-of-2-recoverable.json'; -import * as twoOfThreeJson from './fixtures/templates/2-of-3.json'; -import * as cashChannelsJson from './fixtures/templates/cash-channels.json'; -import * as p2pkhJson from './fixtures/templates/p2pkh.json'; -import * as sigOfSigJson from './fixtures/templates/sig-of-sig.json'; +/* eslint-disable import/no-internal-modules */ +import twoOfTwoRecoverableJson from './fixtures/templates/2-of-2-recoverable.json' assert { type: 'json' }; +import twoOfThreeJson from './fixtures/templates/2-of-3.json' assert { type: 'json' }; +import cashChannelsJson from './fixtures/templates/cash-channels.json' assert { type: 'json' }; +import p2pkhJson from './fixtures/templates/p2pkh.json' assert { type: 'json' }; +import sigOfSigJson from './fixtures/templates/sig-of-sig.json' assert { type: 'json' }; export { - oneOfEightTreeJson, twoOfTwoRecoverableJson, twoOfThreeJson, cashChannelsJson, diff --git a/src/lib/transaction/transaction-e2e.templates.spec.ts b/src/lib/transaction/transaction-e2e.templates.spec.ts index 6f1458aa..e959e24a 100644 --- a/src/lib/transaction/transaction-e2e.templates.spec.ts +++ b/src/lib/transaction/transaction-e2e.templates.spec.ts @@ -1,24 +1,19 @@ -/* eslint-disable functional/no-expression-statement */ - import test from 'ava'; -import { authenticationTemplateP2pkh } from '../lib'; +import { authenticationTemplateP2pkh } from '../lib.js'; -import { oneOfEightTreeSig } from './fixtures/template.1-of-8-tree.spec.helper'; -import { twoOfTwoRecoverable } from './fixtures/template.2-of-2-recoverable.spec.helper'; -import { twoOfThree } from './fixtures/template.2-of-3.spec.helper'; -import { cashChannels } from './fixtures/template.cash-channels.spec.helper'; -import { sigOfSig } from './fixtures/template.sig-of-sig.spec.helper'; +import { twoOfTwoRecoverable } from './fixtures/template.2-of-2-recoverable.spec.helper.js'; +import { twoOfThree } from './fixtures/template.2-of-3.spec.helper.js'; +import { cashChannels } from './fixtures/template.cash-channels.spec.helper.js'; +import { sigOfSig } from './fixtures/template.sig-of-sig.spec.helper.js'; import { cashChannelsJson, - oneOfEightTreeJson, p2pkhJson, sigOfSigJson, twoOfThreeJson, twoOfTwoRecoverableJson, -} from './transaction-e2e.spec.helper'; +} from './transaction-e2e.spec.helper.js'; -// eslint-disable-next-line @typescript-eslint/ban-types const ignoreDefault = (anything: object) => ({ ...anything, default: true, @@ -27,11 +22,6 @@ const ignoreDefault = (anything: object) => ({ test('example authentication templates are updated', (t) => { const solution = 'Run "yarn doc:generate-templates" to correct this issue. (Note: watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc.)'; - t.deepEqual( - ignoreDefault(oneOfEightTreeSig), - ignoreDefault(oneOfEightTreeJson), - `Inconsistency in oneOfEightTreeJson. ${solution}` - ); t.deepEqual( ignoreDefault(twoOfTwoRecoverable), ignoreDefault(twoOfTwoRecoverableJson), diff --git a/src/lib/transaction/transaction-serialization.ts b/src/lib/transaction/transaction-serialization.ts deleted file mode 100644 index 344e8020..00000000 --- a/src/lib/transaction/transaction-serialization.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { Sha256 } from '../crypto/sha256'; -import { - bigIntToBitcoinVarInt, - binToHex, - binToNumberUint32LE, - flattenBinArray, - numberToBinUint32LE, - readBitcoinVarInt, -} from '../format/format'; - -import { Input, Output, Transaction } from './transaction-types'; - -/** - * @param bin - the raw transaction from which to read the input - * @param offset - the offset at which the input begins - */ -export const readTransactionInput = (bin: Uint8Array, offset: number) => { - const sha256HashBytes = 32; - const uint32Bytes = 4; - const offsetAfterTxHash = offset + sha256HashBytes; - const outpointTransactionHash = bin - .slice(offset, offsetAfterTxHash) - .reverse(); - const offsetAfterOutpointIndex = offsetAfterTxHash + uint32Bytes; - const outpointIndex = binToNumberUint32LE( - bin.subarray(offsetAfterTxHash, offsetAfterOutpointIndex) - ); - const { - nextOffset: offsetAfterBytecodeLength, - value: bytecodeLength, - } = readBitcoinVarInt(bin, offsetAfterOutpointIndex); - const offsetAfterBytecode = - offsetAfterBytecodeLength + Number(bytecodeLength); - const unlockingBytecode = bin.slice( - offsetAfterBytecodeLength, - offsetAfterBytecode - ); - const nextOffset = offsetAfterBytecode + uint32Bytes; - const sequenceNumber = binToNumberUint32LE( - bin.subarray(offsetAfterBytecode, nextOffset) - ); - return { - input: { - outpointIndex, - outpointTransactionHash, - sequenceNumber, - unlockingBytecode, - }, - nextOffset, - }; -}; - -/** - * Encode a single input for inclusion in an encoded transaction. - * - * @param output - the input to encode - */ -export const encodeInput = (input: Input) => - flattenBinArray([ - input.outpointTransactionHash.slice().reverse(), - numberToBinUint32LE(input.outpointIndex), - bigIntToBitcoinVarInt(BigInt(input.unlockingBytecode.length)), - input.unlockingBytecode, - numberToBinUint32LE(input.sequenceNumber), - ]); - -/** - * Encode a set of inputs for inclusion in an encoded transaction including - * the prefixed number of inputs. - * - * Format: [BitcoinVarInt: input count] [encoded inputs] - * - * @param inputs - the set of inputs to encode - */ -export const encodeInputs = (inputs: readonly Input[]) => - flattenBinArray([ - bigIntToBitcoinVarInt(BigInt(inputs.length)), - ...inputs.map(encodeInput), - ]); - -/** - * Read a single transaction output from an encoded transaction. - * - * @param bin - the raw transaction from which to read the output - * @param offset - the offset at which the output begins - */ -export const readTransactionOutput = (bin: Uint8Array, offset: number) => { - const uint64Bytes = 8; - const offsetAfterSatoshis = offset + uint64Bytes; - const satoshis = bin.slice(offset, offsetAfterSatoshis); - const { nextOffset: offsetAfterScriptLength, value } = readBitcoinVarInt( - bin, - offsetAfterSatoshis - ); - const bytecodeLength = Number(value); - const nextOffset = offsetAfterScriptLength + bytecodeLength; - const lockingBytecode = - bytecodeLength === 0 - ? new Uint8Array() - : bin.slice(offsetAfterScriptLength, nextOffset); - - return { - nextOffset, - output: { - lockingBytecode, - satoshis, - }, - }; -}; - -/** - * Encode a single output for inclusion in an encoded transaction. - * - * @param output - the output to encode - */ -export const encodeOutput = (output: Output) => - flattenBinArray([ - output.satoshis, - bigIntToBitcoinVarInt(BigInt(output.lockingBytecode.length)), - output.lockingBytecode, - ]); - -/** - * Encode a set of outputs for inclusion in an encoded transaction - * including the prefixed number of outputs. - * - * Format: [BitcoinVarInt: output count] [encoded outputs] - * - * @param outputs - the set of outputs to encode - */ -export const encodeOutputsForTransaction = (outputs: readonly Output[]) => - flattenBinArray([ - bigIntToBitcoinVarInt(BigInt(outputs.length)), - ...outputs.map(encodeOutput), - ]); - -/** - * Decode a `Uint8Array` using the version 1 or 2 raw transaction format. - * - * Note: this method throws runtime errors when attempting to decode messages - * which do not properly follow the transaction format. If the input is - * untrusted, use `decodeTransaction`. - * - * @param bin - the raw message to decode - */ -export const decodeTransactionUnsafe = (bin: Uint8Array): Transaction => { - const uint32Bytes = 4; - const version = binToNumberUint32LE(bin.subarray(0, uint32Bytes)); - const offsetAfterVersion = uint32Bytes; - const { - nextOffset: offsetAfterInputCount, - value: inputCount, - } = readBitcoinVarInt(bin, offsetAfterVersion); - // eslint-disable-next-line functional/no-let - let cursor = offsetAfterInputCount; - const inputs = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus - for (let i = 0; i < Number(inputCount); i++) { - const { input, nextOffset } = readTransactionInput(bin, cursor); - // eslint-disable-next-line functional/no-expression-statement - cursor = nextOffset; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - inputs.push(input); - } - const { - nextOffset: offsetAfterOutputCount, - value: outputCount, - } = readBitcoinVarInt(bin, cursor); - // eslint-disable-next-line functional/no-expression-statement - cursor = offsetAfterOutputCount; - const outputs = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus - for (let i = 0; i < Number(outputCount); i++) { - const { output, nextOffset } = readTransactionOutput(bin, cursor); - // eslint-disable-next-line functional/no-expression-statement - cursor = nextOffset; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - outputs.push(output); - } - const locktime = binToNumberUint32LE( - bin.subarray(cursor, cursor + uint32Bytes) - ); - return { - inputs, - locktime, - outputs, - version, - }; -}; - -export enum TransactionDecodingError { - invalidFormat = 'Transaction decoding error: message does not follow the version 1 or version 2 transaction format.', -} - -/** - * Decode a `Uint8Array` using the version 1 or 2 raw transaction format. - * - * @param bin - the raw message to decode - */ -export const decodeTransaction = (bin: Uint8Array) => { - // eslint-disable-next-line functional/no-try-statement - try { - return decodeTransactionUnsafe(bin); - } catch { - return TransactionDecodingError.invalidFormat; - } -}; - -/** - * Encode a `Transaction` using the standard P2P network format. This - * serialization is also used when computing the transaction's hash (A.K.A. - * "transaction ID" or "TXID"). - */ -export const encodeTransaction = (tx: Transaction) => - flattenBinArray([ - numberToBinUint32LE(tx.version), - encodeInputs(tx.inputs), - encodeOutputsForTransaction(tx.outputs), - numberToBinUint32LE(tx.locktime), - ]); - -/** - * Compute a transaction hash (A.K.A. "transaction ID" or "TXID") from an - * encoded transaction in big-endian byte order. This is the byte order - * typically used by block explorers and other user interfaces. - * - * @returns the transaction hash as a string - * - * @param transaction - the encoded transaction - * @param sha256 - an implementation of sha256 - */ -export const getTransactionHashBE = ( - sha256: { hash: Sha256['hash'] }, - transaction: Uint8Array -) => sha256.hash(sha256.hash(transaction)); - -/** - * Compute a transaction hash (A.K.A. "transaction ID" or "TXID") from an - * encoded transaction in little-endian byte order. This is the byte order - * used in P2P network messages. - * - * @remarks - * The result of sha256 is defined by its specification as big-endian, but - * bitcoin message formats always reverse the order of this result for - * serialization in P2P network messages. - * - * @returns the transaction hash in little-endian byte order - * - * @param transaction - the encoded transaction - * @param sha256 - an implementation of sha256 - */ -export const getTransactionHashLE = ( - sha256: { hash: Sha256['hash'] }, - transaction: Uint8Array -) => getTransactionHashBE(sha256, transaction).reverse(); - -/** - * Return a `Transaction`'s hash as a string (in big-endian byte order as is - * common for user interfaces). - * - * @param transaction - the encoded transaction - * @param sha256 - an implementation of sha256 - */ -export const getTransactionHash = ( - sha256: { hash: Sha256['hash'] }, - transaction: Uint8Array -) => binToHex(getTransactionHashBE(sha256, transaction)); - -/** - * Get the hash of all outpoints in a series of inputs. (For use in - * `hashTransactionOutpoints`.) - * - * @param inputs - the series of inputs from which to extract the outpoints - * @param sha256 - an implementation of sha256 - */ -export const encodeOutpoints = ( - inputs: readonly { - outpointIndex: number; - outpointTransactionHash: Uint8Array; - }[] -) => - flattenBinArray( - inputs.map((i) => - flattenBinArray([ - i.outpointTransactionHash.slice().reverse(), - numberToBinUint32LE(i.outpointIndex), - ]) - ) - ); - -/** - * Encode an array of transaction outputs for use in transaction signing - * serializations. - * - * @param outputs - the array of outputs to encode - */ -export const encodeOutputsForSigning = (outputs: readonly Output[]) => - flattenBinArray(outputs.map(encodeOutput)); - -/** - * Encode an array of input sequence numbers for use in transaction signing - * serializations. - * - * @param inputs - the array of inputs from which to extract the sequence - * numbers - */ -export const encodeSequenceNumbersForSigning = ( - inputs: readonly { sequenceNumber: number }[] -) => flattenBinArray(inputs.map((i) => numberToBinUint32LE(i.sequenceNumber))); diff --git a/src/lib/transaction/transaction.ts b/src/lib/transaction/transaction.ts index bd4b04d5..83470724 100644 --- a/src/lib/transaction/transaction.ts +++ b/src/lib/transaction/transaction.ts @@ -1,4 +1 @@ -export * from './generate-transaction'; -export * from './transaction-serialization'; -export * from './transaction-types'; -export * from './verify-transaction'; +export * from './generate-transaction.js'; diff --git a/src/lib/transaction/verify-transaction.spec.ts b/src/lib/transaction/verify-transaction.spec.ts deleted file mode 100644 index b9bdc107..00000000 --- a/src/lib/transaction/verify-transaction.spec.ts +++ /dev/null @@ -1,123 +0,0 @@ -/* eslint-disable functional/no-expression-statement */ - -import test from 'ava'; - -import { - bigIntToBinUint64LE, - decodeTransaction, - hexToBin, - instantiateVirtualMachineBCH, - Output, - stringify, - verifyTransaction, -} from '../lib'; - -const vmPromise = instantiateVirtualMachineBCH(); - -test('verifyTransaction', async (t) => { - const vm = await vmPromise; - const satoshis = 10000; - const transaction = decodeTransaction( - hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) - ); - if (typeof transaction === 'string') { - t.fail(transaction); - return; - } - - const spentOutputs: Output[] = [ - { - lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' - ), - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), - }, - ]; - - const result = verifyTransaction({ spentOutputs, transaction, vm }); - t.deepEqual(result, true, stringify(result)); -}); - -test('verifyTransaction: ', async (t) => { - const vm = await vmPromise; - const satoshis = 10000; - const transaction = decodeTransaction( - hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) - ); - if (typeof transaction === 'string') { - t.fail(transaction); - return; - } - - const spentOutputs: Output[] = [ - { - lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' - ), - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), - }, - ]; - - const result = verifyTransaction({ spentOutputs, transaction, vm }); - t.deepEqual(result, true, stringify(result)); -}); - -test('verifyTransaction: incorrect spentOutputs length', async (t) => { - const vm = await vmPromise; - const transaction = decodeTransaction( - hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) - ); - if (typeof transaction === 'string') { - t.fail(transaction); - return; - } - - const spentOutputs: Output[] = []; - - const result = verifyTransaction({ spentOutputs, transaction, vm }); - t.deepEqual( - result, - [ - 'Unable to verify transaction: a spent output must be provided for each transaction input.', - ], - stringify(result) - ); -}); - -test('verifyTransaction: invalid input', async (t) => { - const vm = await vmPromise; - const satoshis = 10000; - const transaction = decodeTransaction( - hexToBin( - '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) - ); - if (typeof transaction === 'string') { - t.fail(transaction); - return; - } - - const spentOutputs: Output[] = [ - { - lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' - ), - satoshis: bigIntToBinUint64LE(BigInt(satoshis)), - }, - ]; - - const result = verifyTransaction({ spentOutputs, transaction, vm }); - t.deepEqual( - result, - [ - 'Error in evaluating input index "0": Program failed a signature verification with a non-null signature (violating the "NULLFAIL" rule).', - ], - stringify(result) - ); -}); diff --git a/src/lib/transaction/verify-transaction.ts b/src/lib/transaction/verify-transaction.ts deleted file mode 100644 index a859516f..00000000 --- a/src/lib/transaction/verify-transaction.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { - AuthenticationErrorBCH, - AuthenticationProgramCommon, - AuthenticationProgramStateCommon, - AuthenticationVirtualMachine, - OpcodesBCH, -} from '../vm/vm'; - -import { Output, Transaction } from './transaction-types'; - -/** - * Statelessly verify a transaction given an `AuthenticationVirtualMachine` and - * a list of spent outputs (the `lockingBytecode` and `satoshis` being spent by - * each input). - * - * Note, while the virtual machine will evaluate locktime-related operations - * against the transactions own `locktime`, this method does not verify the - * transaction's `locktime` property itself (allowing verification to be - * stateless). - * - * Before a statelessly verified transaction can be added to the blockchain, - * node implementations must confirm that: - * - all `spentOutputs` are still unspent, and - * - both relative and absolute locktime consensus requirements have been met. - * (See BIP65, BIP68, and BIP112 for details.) - * - * @param spentOutputs - an array of the `Output`s spent by the transaction's - * `inputs` in matching order (`inputs[0]` spends `spentOutputs[0]`, etc.) - * @param transaction - the transaction to verify - * @param vm - the authentication virtual machine to use in validation - */ -export const verifyTransaction = < - VirtualMachine extends AuthenticationVirtualMachine< - AuthenticationProgram, - ProgramState - >, - AuthenticationProgram extends AuthenticationProgramCommon, - ProgramState extends AuthenticationProgramStateCommon, - Opcodes = OpcodesBCH, - Errors = AuthenticationErrorBCH ->({ - spentOutputs, - transaction, - vm, -}: { - transaction: Transaction; - spentOutputs: Output[]; - vm: VirtualMachine; -}) => { - if (transaction.inputs.length !== spentOutputs.length) { - return [ - 'Unable to verify transaction: a spent output must be provided for each transaction input.', - ]; - } - const errors = transaction.inputs.reduce((all, _, index) => { - const program = { - inputIndex: index, - sourceOutput: spentOutputs[index], - spendingTransaction: transaction, - } as AuthenticationProgram; - const state = vm.evaluate(program); - const verify = vm.verify(state); - if (verify === true) { - return all; - } - return [...all, `Error in evaluating input index "${index}": ${verify}`]; - }, []); - - return errors.length === 0 ? true : errors; -}; diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021-descriptions.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-descriptions.ts new file mode 100644 index 00000000..ad3b09c3 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-descriptions.ts @@ -0,0 +1,191 @@ +export enum OpcodeDescriptionsBCH2021 { + OP_0 = 'Push the VM Number 0 onto the stack.', + OP_PUSHBYTES_1 = 'Push the next byte onto the stack.', + OP_PUSHBYTES_2 = 'Push the next 2 bytes onto the stack.', + OP_PUSHBYTES_3 = 'Push the next 3 bytes onto the stack.', + OP_PUSHBYTES_4 = 'Push the next 4 bytes onto the stack.', + OP_PUSHBYTES_5 = 'Push the next 5 bytes onto the stack.', + OP_PUSHBYTES_6 = 'Push the next 6 bytes onto the stack.', + OP_PUSHBYTES_7 = 'Push the next 7 bytes onto the stack.', + OP_PUSHBYTES_8 = 'Push the next 8 bytes onto the stack.', + OP_PUSHBYTES_9 = 'Push the next 9 bytes onto the stack.', + OP_PUSHBYTES_10 = 'Push the next 10 bytes onto the stack.', + OP_PUSHBYTES_11 = 'Push the next 11 bytes onto the stack.', + OP_PUSHBYTES_12 = 'Push the next 12 bytes onto the stack.', + OP_PUSHBYTES_13 = 'Push the next 13 bytes onto the stack.', + OP_PUSHBYTES_14 = 'Push the next 14 bytes onto the stack.', + OP_PUSHBYTES_15 = 'Push the next 15 bytes onto the stack.', + OP_PUSHBYTES_16 = 'Push the next 16 bytes onto the stack.', + OP_PUSHBYTES_17 = 'Push the next 17 bytes onto the stack.', + OP_PUSHBYTES_18 = 'Push the next 18 bytes onto the stack.', + OP_PUSHBYTES_19 = 'Push the next 19 bytes onto the stack.', + OP_PUSHBYTES_20 = 'Push the next 20 bytes onto the stack.', + OP_PUSHBYTES_21 = 'Push the next 21 bytes onto the stack.', + OP_PUSHBYTES_22 = 'Push the next 22 bytes onto the stack.', + OP_PUSHBYTES_23 = 'Push the next 23 bytes onto the stack.', + OP_PUSHBYTES_24 = 'Push the next 24 bytes onto the stack.', + OP_PUSHBYTES_25 = 'Push the next 25 bytes onto the stack.', + OP_PUSHBYTES_26 = 'Push the next 26 bytes onto the stack.', + OP_PUSHBYTES_27 = 'Push the next 27 bytes onto the stack.', + OP_PUSHBYTES_28 = 'Push the next 28 bytes onto the stack.', + OP_PUSHBYTES_29 = 'Push the next 29 bytes onto the stack.', + OP_PUSHBYTES_30 = 'Push the next 30 bytes onto the stack.', + OP_PUSHBYTES_31 = 'Push the next 31 bytes onto the stack.', + OP_PUSHBYTES_32 = 'Push the next 32 bytes onto the stack.', + OP_PUSHBYTES_33 = 'Push the next 33 bytes onto the stack.', + OP_PUSHBYTES_34 = 'Push the next 34 bytes onto the stack.', + OP_PUSHBYTES_35 = 'Push the next 35 bytes onto the stack.', + OP_PUSHBYTES_36 = 'Push the next 36 bytes onto the stack.', + OP_PUSHBYTES_37 = 'Push the next 37 bytes onto the stack.', + OP_PUSHBYTES_38 = 'Push the next 38 bytes onto the stack.', + OP_PUSHBYTES_39 = 'Push the next 39 bytes onto the stack.', + OP_PUSHBYTES_40 = 'Push the next 40 bytes onto the stack.', + OP_PUSHBYTES_41 = 'Push the next 41 bytes onto the stack.', + OP_PUSHBYTES_42 = 'Push the next 42 bytes onto the stack.', + OP_PUSHBYTES_43 = 'Push the next 43 bytes onto the stack.', + OP_PUSHBYTES_44 = 'Push the next 44 bytes onto the stack.', + OP_PUSHBYTES_45 = 'Push the next 45 bytes onto the stack.', + OP_PUSHBYTES_46 = 'Push the next 46 bytes onto the stack.', + OP_PUSHBYTES_47 = 'Push the next 47 bytes onto the stack.', + OP_PUSHBYTES_48 = 'Push the next 48 bytes onto the stack.', + OP_PUSHBYTES_49 = 'Push the next 49 bytes onto the stack.', + OP_PUSHBYTES_50 = 'Push the next 50 bytes onto the stack.', + OP_PUSHBYTES_51 = 'Push the next 51 bytes onto the stack.', + OP_PUSHBYTES_52 = 'Push the next 52 bytes onto the stack.', + OP_PUSHBYTES_53 = 'Push the next 53 bytes onto the stack.', + OP_PUSHBYTES_54 = 'Push the next 54 bytes onto the stack.', + OP_PUSHBYTES_55 = 'Push the next 55 bytes onto the stack.', + OP_PUSHBYTES_56 = 'Push the next 56 bytes onto the stack.', + OP_PUSHBYTES_57 = 'Push the next 57 bytes onto the stack.', + OP_PUSHBYTES_58 = 'Push the next 58 bytes onto the stack.', + OP_PUSHBYTES_59 = 'Push the next 59 bytes onto the stack.', + OP_PUSHBYTES_60 = 'Push the next 60 bytes onto the stack.', + OP_PUSHBYTES_61 = 'Push the next 61 bytes onto the stack.', + OP_PUSHBYTES_62 = 'Push the next 62 bytes onto the stack.', + OP_PUSHBYTES_63 = 'Push the next 63 bytes onto the stack.', + OP_PUSHBYTES_64 = 'Push the next 64 bytes onto the stack.', + OP_PUSHBYTES_65 = 'Push the next 65 bytes onto the stack.', + OP_PUSHBYTES_66 = 'Push the next 66 bytes onto the stack.', + OP_PUSHBYTES_67 = 'Push the next 67 bytes onto the stack.', + OP_PUSHBYTES_68 = 'Push the next 68 bytes onto the stack.', + OP_PUSHBYTES_69 = 'Push the next 69 bytes onto the stack.', + OP_PUSHBYTES_70 = 'Push the next 70 bytes onto the stack.', + OP_PUSHBYTES_71 = 'Push the next 71 bytes onto the stack.', + OP_PUSHBYTES_72 = 'Push the next 72 bytes onto the stack.', + OP_PUSHBYTES_73 = 'Push the next 73 bytes onto the stack.', + OP_PUSHBYTES_74 = 'Push the next 74 bytes onto the stack.', + OP_PUSHBYTES_75 = 'Push the next 75 bytes onto the stack.', + OP_PUSHDATA_1 = 'Read the next Uint8 and push that number of bytes onto the stack.', + OP_PUSHDATA_2 = 'Read the next little-endian Uint16 and push that number of bytes onto the stack.', + OP_PUSHDATA_4 = 'Read the next little-endian Uint32 and push that number of bytes onto the stack.', + OP_1NEGATE = 'Push the VM Number -1 onto the stack.', + OP_RESERVED = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED does not count toward the opcode limit.', + OP_1 = 'Push a 1 (VM Number) onto the stack.', + OP_2 = 'Push a 2 (VM Number) onto the stack.', + OP_3 = 'Push a 3 (VM Number) onto the stack.', + OP_4 = 'Push a 4 (VM Number) onto the stack.', + OP_5 = 'Push a 5 (VM Number) onto the stack.', + OP_6 = 'Push a 6 (VM Number) onto the stack.', + OP_7 = 'Push a 7 (VM Number) onto the stack.', + OP_8 = 'Push a 8 (VM Number) onto the stack.', + OP_9 = 'Push a 9 (VM Number) onto the stack.', + OP_10 = 'Push a 10 (VM Number) onto the stack.', + OP_11 = 'Push a 11 (VM Number) onto the stack.', + OP_12 = 'Push a 12 (VM Number) onto the stack.', + OP_13 = 'Push a 13 (VM Number) onto the stack.', + OP_14 = 'Push a 14 (VM Number) onto the stack.', + OP_15 = 'Push a 15 (VM Number) onto the stack.', + OP_16 = 'Push a 16 (VM Number) onto the stack.', + OP_NOP = 'No operation. Note: OP_NOP counts toward the opcode limit.', + OP_VER = 'Error unless found in an unexecuted conditional branch. Note: OP_VER counts toward the opcode limit. (Historically, this pushed a protocol version number to the stack.)', + OP_IF = 'Pop the top item from the stack. If it is not "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', + OP_NOTIF = 'Pop the top item from the stack. If it is "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', + OP_VERIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_IF.)', + OP_VERNOTIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_NOTIF.)', + OP_ELSE = 'Invert conditional evaluation within the current OP_IF ... OP_ENDIF block. (If evaluation is enabled, disable it, if it is disabled, enable it.)', + OP_ENDIF = 'End the current OP_IF/OP_NOTIF ... OP_ENDIF block.', + OP_VERIFY = 'Pop the top item from the stack and error if it isn\'t "truthy".', + OP_RETURN = 'Error when executed.', + OP_TOALTSTACK = 'Pop the top item from the stack and push it onto the alternate stack.', + OP_FROMALTSTACK = 'Pop the top item from the alternate stack and push it onto the stack.', + OP_2DROP = 'Pop the top 2 items from the stack and discard them.', + OP_2DUP = 'Duplicate the top 2 items on the stack. (E.g. [a, b] -> [a, b, a, b])', + OP_3DUP = 'Duplicate the top 3 items on the stack. (E.g. [a, b, c] -> [a, b, c, a, b, c])', + OP_2OVER = 'Duplicate the 2 items beginning at a depth of 2 on the stack. (E.g. [a, b, c, d] -> [a, b, c, d, a, b])', + OP_2ROT = 'Rotate the top 6 items on the stack, bringing the fifth and sixth items to the top. (E.g. [a, b, c, d, e, f] -> [c, d, e, f, a, b])', + OP_2SWAP = 'Swap the positions of the top two pairs of items on the stack. (E.g. [a, b, c, d] -> [c, d, a, b])', + OP_IFDUP = 'If the top item on the stack is "truthy", duplicate it.', + OP_DEPTH = 'Push the current number of stack items as a VM Number.', + OP_DROP = 'Pop the top item from the stack and discard it. (E.g. [a] -> [])', + OP_DUP = 'Duplicate the top item on the stack. (E.g. [a] -> [a, a])', + OP_NIP = 'Remove the second-to-top item from the stack. (E.g. [a, b] -> [b])', + OP_OVER = 'Duplicate the second-to-top item on the stack. (E.g. [a, b] -> [a, b, a])', + OP_PICK = 'Pop the top item from the stack as a VM Number. Duplicate the item at that depth (zero-indexed), placing it on top of the stack. (E.g. [a, b, c, 2] -> [a, b, c, a])', + OP_ROLL = 'Pop the top item from the stack as a VM Number. Move the item at that depth (zero-indexed) to the top of the stack. (E.g. [a, b, c, 2] -> [b, c, a])', + OP_ROT = 'Rotate the top 3 items on the stack, bringing the third item to the top. (E.g. [a, b, c] -> [b, c, a])', + OP_SWAP = 'Swap the top two items on the stack. (E.g. [a, b] -> [b, a])', + OP_TUCK = 'Duplicate the item at the top of the stack, inserting it below the second-to-top item. (E.g. [a, b] -> [b, a, b])', + OP_CAT = 'Pop the top 2 items from the stack and concatenate them, pushing the result.', + OP_SPLIT = 'Pop the top item from the stack as an index (VM Number) and the next item as a byte array. Split the byte array into two stack items at the index (zero-based), pushing the results.', + OP_NUM2BIN = 'Pop the top item from the stack as an item length (VM Number) and the next item as a VM Number (without encoding restrictions). Re-encode the number using a byte array of the provided length, filling any unused bytes with zeros, then push the result. (If the requested length is too short to encode the number, error.)', + OP_BIN2NUM = "Pop the top item from the stack as a VM Number without encoding restrictions. Minimally-encode the number and push the result. (If the number can't be encoded in 4 bytes or less, error.)", + OP_SIZE = 'Push the byte-length of the top stack item as a VM Number.', + OP_INVERT = 'Error, even when found in an unexecuted conditional branch. (Historically, this flipped all the bits in a stack item.)', + OP_AND = 'Pop the top 2 items from the stack and perform a bitwise AND on each byte, pushing the result. If the length of the items are not equal, error.', + OP_OR = 'Pop the top 2 items from the stack and perform a bitwise OR on each byte, pushing the result. If the length of the items are not equal, error.', + OP_XOR = 'Pop the top 2 items from the stack and perform a bitwise XOR on each byte, pushing the result. If the length of the items are not equal, error.', + OP_EQUAL = 'Pop the top two items from the stack and compare them byte-by-byte. If they are the same, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_EQUALVERIFY = 'Pop the top two items from the stack and compare them byte-by-byte. If the values are different, error. (This operation is a combination of OP_EQUAL followed by OP_VERIFY.)', + OP_RESERVED1 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED1 counts toward the opcode limit.', + OP_RESERVED2 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED2 counts toward the opcode limit.', + OP_1ADD = 'Pop the top item from the stack as a VM Number, add 1, then push the result.', + OP_1SUB = 'Pop the top item from the stack as a VM Number, subtract 1, then push the result.', + OP_2MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied a VM Number by 2.)', + OP_2DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided a VM Number by 2.)', + OP_NEGATE = 'Pop the top item from the stack as a VM Number, negate it, then push the result.', + OP_ABS = 'Pop the top item from the stack as a VM Number, take its absolute value, then push the result.', + OP_NOT = 'Pop the top item from the stack as a VM Number. If its value is 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_0NOTEQUAL = 'Pop the top item from the stack as a VM Number. If its value is not 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_ADD = 'Pop the top two items from the stack as VM Numbers. Add them, then push the result.', + OP_SUB = 'Pop the top two items from the stack as VM Numbers. Subtract the top item from the second item, then push the result.', + OP_MUL = 'Pop the top two items from the stack as VM Numbers. Multiply them, then push the result.', + OP_DIV = 'Pop the top item from the stack as a denominator (VM Number) and the next as a numerator (VM Number). Divide and push the result to the stack.', + OP_MOD = 'Pop the top item from the stack as a denominator (VM Number) and the next as a numerator (VM Number). Divide and push the remainder to the stack.', + OP_LSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, left bit shift.)', + OP_RSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, right bit shift.)', + OP_BOOLAND = 'Pop the top two items from the stack as VM Numbers. If neither value is a 0 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_BOOLOR = 'Pop the top two items from the stack as VM Numbers. If either value is a 1 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUALVERIFY = 'Pop the top two items from the stack as VM Numbers. If the values are different, error. (This operation is a combination of OP_NUMEQUAL followed by OP_VERIFY.)', + OP_NUMNOTEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are not equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is less than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is less than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_MIN = 'Pop the top two items from the stack as VM Numbers. Push the smaller of the two numbers.', + OP_MAX = 'Pop the top two items from the stack as VM Numbers. Push the larger of the two numbers.', + OP_WITHIN = 'Pop the top three items from the stack as VM Numbers. If the top number is within the range defined by the following two numbers (left-inclusive), push a 1 (VM Number). Otherwise, push a 0 (VM Number). (E.g. for [a, b, c]: if (b <= a), and (a < c), [1]. Else [0].)', + OP_RIPEMD160 = 'Pop the top item from the stack and pass it through ripemd160, pushing the result onto the stack.', + OP_SHA1 = 'Pop the top item from the stack and pass it through sha1, pushing the result onto the stack.', + OP_SHA256 = 'Pop the top item from the stack and pass it through sha256, pushing the result onto the stack.', + OP_HASH160 = 'Pop the top item from the stack and pass it through sha256, then ripemd160, pushing the result onto the stack.', + OP_HASH256 = 'Pop the top item from the stack and pass it through sha256 twice, pushing the result onto the stack.', + OP_CODESEPARATOR = "Update the value of lastCodeSeparator to the instruction pointer's current value. (This reduces the coverage of signing serializations used in signature verification operations.)", + OP_CHECKSIG = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is valid, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKSIGVERIFY = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is not valid, error. (This operation is a combination of OP_CHECKSIG followed by OP_VERIFY.)', + OP_CHECKMULTISIG = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, pop a final VM Number that must be 0 due to a protocol bug. Checking each signature against each public key in order, if all signatures are valid – and the required number of signatures have been provided – push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKMULTISIGVERIFY = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, (due to a protocol bug) pop an unused final VM Number that must be 0. Checking each signature against each public key in order, if any signatures are invalid – or the required number of signatures have not been provided – error. (This operation is a combination of OP_CHECKMULTISIG followed by OP_VERIFY.)', + OP_NOP1 = 'No operation (reserved for future expansion). Note: OP_NOP1 counts toward the opcode limit.', + OP_CHECKLOCKTIMEVERIFY = "Verify the transaction occurs after an absolute block time or height: read the top item on the stack as a VM Number (without removing it), and compare it to the transaction's locktime. If the required locktime has not passed, or if locktime has been disabled for this input by a maximized sequence number, error.", + OP_CHECKSEQUENCEVERIFY = 'Verify the transaction occurs after the output being spent has "aged" by a relative block time or block height since it was created: read the top item on the stack as a VM Number (without removing it), and compare it to the age encoded in the input\'s sequence number. If the required relative locktime has not passed, or if relative locktime has been disabled by the sequence number or the transaction version, error.', + OP_NOP4 = 'No operation (reserved for future expansion). Note: OP_NOP4 counts toward the opcode limit.', + OP_NOP6 = 'No operation (reserved for future expansion). Note: OP_NOP6 counts toward the opcode limit.', + OP_NOP5 = 'No operation (reserved for future expansion). Note: OP_NOP5 counts toward the opcode limit.', + OP_NOP7 = 'No operation (reserved for future expansion). Note: OP_NOP7 counts toward the opcode limit.', + OP_NOP8 = 'No operation (reserved for future expansion). Note: OP_NOP8 counts toward the opcode limit.', + OP_NOP9 = 'No operation (reserved for future expansion). Note: OP_NOP9 counts toward the opcode limit.', + OP_NOP10 = 'No operation (reserved for future expansion). Note: OP_NOP10 counts toward the opcode limit.', + OP_CHECKDATASIG = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is valid, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKDATASIGVERIFY = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is not valid, error. (This operation is a combination of OP_CHECKDATASIG followed by OP_VERIFY.)', + OP_REVERSEBYTES = 'Pop the top item from the stack and reverse it, pushing the result.', +} diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-instruction-set.ts new file mode 100644 index 00000000..9dbf65c4 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-instruction-set.ts @@ -0,0 +1,116 @@ +import type { + AuthenticationProgramBCH, + AuthenticationProgramStateBCH, + InstructionSet, + ResolvedTransactionBCH, +} from '../../../../lib'; +import { + conditionallyEvaluate, + disabledOperation, + incrementOperationCount, + mapOverOperations, + undefinedOperation, +} from '../../common/common.js'; +import { createInstructionSetBCH2022 } from '../2022/bch-2022-instruction-set.js'; +import { OpcodesBCH2022 } from '../2022/bch-2022-opcodes.js'; + +import { + op0NotEqual4Byte, + op1Add4Byte, + op1Sub4Byte, + opAbs4Byte, + opAdd4Byte, + opBin2Num4Byte, + opBoolAnd4Byte, + opBoolOr4Byte, + opDiv4Byte, + opGreaterThan4Byte, + opGreaterThanOrEqual4Byte, + opLessThan4Byte, + opLessThanOrEqual4Byte, + opMax4Byte, + opMin4Byte, + opMod4Byte, + opNegate4Byte, + opNot4Byte, + opNum2Bin4Byte, + opNumEqual4Byte, + opNumEqualVerify4Byte, + opNumNotEqual4Byte, + opPick4Byte, + opRoll4Byte, + opSplit4Byte, + opSub4Byte, + opWithin4Byte, +} from './bch-2021-vm-number-operations.js'; + +/** + * create an instance of the BCH 2021 virtual machine instruction set. + * + * @param standard - If `true`, the additional `isStandard` validations will be + * enabled. Transactions that fail these rules are often called "non-standard" + * and can technically be included by miners in valid blocks, but most network + * nodes will refuse to relay them. (Default: `true`) + */ +export const createInstructionSetBCH2021 = ( + standard = true +): InstructionSet< + ResolvedTransactionBCH, + AuthenticationProgramBCH, + AuthenticationProgramStateBCH +> => { + const instructionSet = createInstructionSetBCH2022(standard); + return { + ...instructionSet, + operations: { + ...instructionSet.operations, + ...mapOverOperations( + [conditionallyEvaluate, incrementOperationCount], + { + [OpcodesBCH2022.OP_PICK]: opPick4Byte, + [OpcodesBCH2022.OP_ROLL]: opRoll4Byte, + [OpcodesBCH2022.OP_SPLIT]: opSplit4Byte, + [OpcodesBCH2022.OP_NUM2BIN]: opNum2Bin4Byte, + [OpcodesBCH2022.OP_BIN2NUM]: opBin2Num4Byte, + [OpcodesBCH2022.OP_1ADD]: op1Add4Byte, + [OpcodesBCH2022.OP_1SUB]: op1Sub4Byte, + [OpcodesBCH2022.OP_NEGATE]: opNegate4Byte, + [OpcodesBCH2022.OP_ABS]: opAbs4Byte, + [OpcodesBCH2022.OP_NOT]: opNot4Byte, + [OpcodesBCH2022.OP_0NOTEQUAL]: op0NotEqual4Byte, + [OpcodesBCH2022.OP_ADD]: opAdd4Byte, + [OpcodesBCH2022.OP_SUB]: opSub4Byte, + [OpcodesBCH2022.OP_MUL]: disabledOperation, + [OpcodesBCH2022.OP_DIV]: opDiv4Byte, + [OpcodesBCH2022.OP_MOD]: opMod4Byte, + [OpcodesBCH2022.OP_BOOLAND]: opBoolAnd4Byte, + [OpcodesBCH2022.OP_BOOLOR]: opBoolOr4Byte, + [OpcodesBCH2022.OP_NUMEQUAL]: opNumEqual4Byte, + [OpcodesBCH2022.OP_NUMEQUALVERIFY]: opNumEqualVerify4Byte, + [OpcodesBCH2022.OP_NUMNOTEQUAL]: opNumNotEqual4Byte, + [OpcodesBCH2022.OP_LESSTHAN]: opLessThan4Byte, + [OpcodesBCH2022.OP_GREATERTHAN]: opGreaterThan4Byte, + [OpcodesBCH2022.OP_LESSTHANOREQUAL]: opLessThanOrEqual4Byte, + [OpcodesBCH2022.OP_GREATERTHANOREQUAL]: opGreaterThanOrEqual4Byte, + [OpcodesBCH2022.OP_MIN]: opMin4Byte, + [OpcodesBCH2022.OP_MAX]: opMax4Byte, + [OpcodesBCH2022.OP_WITHIN]: opWithin4Byte, + } + ), + [OpcodesBCH2022.OP_INPUTINDEX]: undefinedOperation, + [OpcodesBCH2022.OP_ACTIVEBYTECODE]: undefinedOperation, + [OpcodesBCH2022.OP_TXVERSION]: undefinedOperation, + [OpcodesBCH2022.OP_TXINPUTCOUNT]: undefinedOperation, + [OpcodesBCH2022.OP_TXOUTPUTCOUNT]: undefinedOperation, + [OpcodesBCH2022.OP_TXLOCKTIME]: undefinedOperation, + [OpcodesBCH2022.OP_UTXOVALUE]: undefinedOperation, + [OpcodesBCH2022.OP_UTXOBYTECODE]: undefinedOperation, + [OpcodesBCH2022.OP_OUTPOINTTXHASH]: undefinedOperation, + [OpcodesBCH2022.OP_OUTPOINTINDEX]: undefinedOperation, + [OpcodesBCH2022.OP_INPUTBYTECODE]: undefinedOperation, + [OpcodesBCH2022.OP_INPUTSEQUENCENUMBER]: undefinedOperation, + [OpcodesBCH2022.OP_OUTPUTVALUE]: undefinedOperation, + [OpcodesBCH2022.OP_OUTPUTBYTECODE]: undefinedOperation, + }, + }; +}; diff --git a/src/lib/vm/instruction-sets/common/opcodes.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-opcodes.ts similarity index 96% rename from src/lib/vm/instruction-sets/common/opcodes.ts rename to src/lib/vm/instruction-sets/bch/2021/bch-2021-opcodes.ts index dd524d0b..26e8dfed 100644 --- a/src/lib/vm/instruction-sets/common/opcodes.ts +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-opcodes.ts @@ -1,4 +1,4 @@ -export enum OpcodesCommon { +export enum OpcodesBCH2021 { /** * A.K.A. `OP_FALSE` or `OP_PUSHBYTES_0` */ @@ -132,9 +132,9 @@ export enum OpcodesCommon { OP_SWAP = 0x7c, OP_TUCK = 0x7d, OP_CAT = 0x7e, - OP_SUBSTR = 0x7f, - OP_LEFT = 0x80, - OP_RIGHT = 0x81, + OP_SPLIT = 0x7f, + OP_NUM2BIN = 0x80, + OP_BIN2NUM = 0x81, OP_SIZE = 0x82, OP_INVERT = 0x83, OP_AND = 0x84, @@ -182,13 +182,7 @@ export enum OpcodesCommon { OP_CHECKMULTISIG = 0xae, OP_CHECKMULTISIGVERIFY = 0xaf, OP_NOP1 = 0xb0, - /** - * Previously `OP_NOP2` - */ OP_CHECKLOCKTIMEVERIFY = 0xb1, - /** - * Previously `OP_NOP2` - */ OP_CHECKSEQUENCEVERIFY = 0xb2, OP_NOP4 = 0xb3, OP_NOP5 = 0xb4, @@ -197,9 +191,9 @@ export enum OpcodesCommon { OP_NOP8 = 0xb7, OP_NOP9 = 0xb8, OP_NOP10 = 0xb9, - OP_UNKNOWN186 = 0xba, - OP_UNKNOWN187 = 0xbb, - OP_UNKNOWN188 = 0xbc, + OP_CHECKDATASIG = 0xba, + OP_CHECKDATASIGVERIFY = 0xbb, + OP_REVERSEBYTES = 0xbc, OP_UNKNOWN189 = 0xbd, OP_UNKNOWN190 = 0xbe, OP_UNKNOWN191 = 0xbf, diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021-types.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-types.ts new file mode 100644 index 00000000..2fdb58e3 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-types.ts @@ -0,0 +1,20 @@ +export enum ConsensusBCH2021 { + /** + * A.K.A. `MAX_SCRIPT_ELEMENT_SIZE` + */ + maximumStackItemLength = 520, + maximumVmNumberLength = 4, + /** + * A.K.A. `MAX_OPS_PER_SCRIPT` + */ + maximumOperationCount = 201, + /** + * A.K.A. `MAX_SCRIPT_SIZE` + */ + maximumBytecodeLength = 10000, + /** + * A.K.A. `MAX_STACK_SIZE` + */ + maximumStackDepth = 1000, + schnorrSignatureLength = 64, +} diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm-number-operations.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm-number-operations.ts new file mode 100644 index 00000000..84409127 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm-number-operations.ts @@ -0,0 +1,435 @@ +import type { + AuthenticationProgramStateError, + AuthenticationProgramStateStack, +} from '../../../../lib'; +import { + applyError, + AuthenticationErrorCommon, + bigIntToVmNumber, + booleanToVmNumber, + combineOperations, + opVerify, + padMinimallyEncodedVmNumber, + pushToStack, + useOneStackItem, + useOneVmNumber, + useThreeVmNumbers, + useTwoVmNumbers, +} from '../../common/common.js'; + +import { ConsensusBCH2021 } from './bch-2021-types.js'; + +const maximumVmNumberByteLength = ConsensusBCH2021.maximumVmNumberLength; + +export const opPick4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, depth) => { + const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; + if (item === undefined) { + return applyError(state, AuthenticationErrorCommon.invalidStackIndex); + } + return pushToStack(nextState, item.slice()); + }); + +export const opRoll4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, depth) => { + const index = nextState.stack.length - 1 - Number(depth); + if (index < 0 || index > nextState.stack.length - 1) { + return applyError(state, AuthenticationErrorCommon.invalidStackIndex); + } + // eslint-disable-next-line functional/immutable-data, @typescript-eslint/no-non-null-assertion + return pushToStack(nextState, nextState.stack.splice(index, 1)[0]!); + }); + +export const opSplit4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, value) => { + const index = Number(value); + return useOneStackItem(nextState, (finalState, [item]) => + index < 0 || index > item.length + ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) + : pushToStack(finalState, item.slice(0, index), item.slice(index)) + ); + }, + { maximumVmNumberByteLength } + ); + +export const opNum2Bin4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, value) => { + const targetLength = Number(value); + return targetLength > ConsensusBCH2021.maximumStackItemLength + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumStackItemLength + ) + : useOneVmNumber( + nextState, + (finalState, [target]) => { + const minimallyEncoded = bigIntToVmNumber(target); + return minimallyEncoded.length > targetLength + ? applyError( + finalState, + AuthenticationErrorCommon.insufficientLength + ) + : minimallyEncoded.length === targetLength + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) + ); + }, + { + maximumVmNumberByteLength: ConsensusBCH2021.maximumStackItemLength, + requireMinimalEncoding: false, + } + ); + }); + +export const opBin2Num4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [target]) => { + const minimallyEncoded = bigIntToVmNumber(target); + return minimallyEncoded.length > ConsensusBCH2021.maximumVmNumberLength + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumVmNumberLength + ) + : pushToStack(nextState, minimallyEncoded); + }, + { + maximumVmNumberByteLength: ConsensusBCH2021.maximumStackItemLength, + requireMinimalEncoding: false, + } + ); + +export const op1Add4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(value + BigInt(1))), + { maximumVmNumberByteLength } + ); + +export const op1Sub4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(value - BigInt(1))), + { maximumVmNumberByteLength } + ); + +export const opNegate4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(-value)), + { maximumVmNumberByteLength } + ); + +export const opAbs4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)), + { maximumVmNumberByteLength } + ); + +export const opNot4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => + pushToStack( + nextState, + value === BigInt(0) + ? bigIntToVmNumber(BigInt(1)) + : bigIntToVmNumber(BigInt(0)) + ), + { maximumVmNumberByteLength } + ); + +export const op0NotEqual4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [value]) => + pushToStack( + nextState, + value === BigInt(0) + ? bigIntToVmNumber(BigInt(0)) + : bigIntToVmNumber(BigInt(1)) + ), + { maximumVmNumberByteLength } + ); + +export const opAdd4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, bigIntToVmNumber(firstValue + secondValue)), + { maximumVmNumberByteLength } + ); + +export const opSub4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)), + { maximumVmNumberByteLength } + ); + +export const opDiv4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [a, b]) => + b === BigInt(0) + ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) + : pushToStack(nextState, bigIntToVmNumber(a / b)), + { maximumVmNumberByteLength } + ); + +export const opMod4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [a, b]) => + b === BigInt(0) + ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) + : pushToStack(nextState, bigIntToVmNumber(a % b)), + { maximumVmNumberByteLength } + ); + +export const opBoolAnd4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + booleanToVmNumber(firstValue !== BigInt(0) && secondValue !== BigInt(0)) + ), + { maximumVmNumberByteLength } + ); + +export const opBoolOr4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + booleanToVmNumber(firstValue !== BigInt(0) || secondValue !== BigInt(0)) + ), + { maximumVmNumberByteLength } + ); + +export const opNumEqual4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)), + { maximumVmNumberByteLength } + ); + +export const opNumEqualVerify4Byte = combineOperations( + opNumEqual4Byte, + opVerify +); + +export const opNumNotEqual4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)), + { maximumVmNumberByteLength } + ); + +export const opLessThan4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)), + { maximumVmNumberByteLength } + ); + +export const opLessThanOrEqual4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)), + { maximumVmNumberByteLength } + ); + +export const opGreaterThan4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)), + { maximumVmNumberByteLength } + ); + +export const opGreaterThanOrEqual4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)), + { maximumVmNumberByteLength } + ); + +export const opMin4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) + ), + { maximumVmNumberByteLength } + ); + +export const opMax4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers( + state, + (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) + ), + { maximumVmNumberByteLength } + ); + +export const opWithin4Byte = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useThreeVmNumbers( + state, + (nextState, [firstValue, secondValue, thirdValue]) => + pushToStack( + nextState, + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) + ), + { maximumVmNumberByteLength } + ); diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm.ts new file mode 100644 index 00000000..6324ced8 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021-vm.ts @@ -0,0 +1,14 @@ +import { createAuthenticationVirtualMachine } from '../../../virtual-machine.js'; + +import { createInstructionSetBCH2021 } from './bch-2021-instruction-set.js'; + +/** + * Initialize a virtual machine using the BCH instruction set. + * + * @param standard - If `true`, the additional `isStandard` validations will be + * enabled. Transactions that fail these rules are often called "non-standard" + * and can technically be included by miners in valid blocks, but most network + * nodes will refuse to relay them. (Default: `true`) + */ +export const createVirtualMachineBCH2021 = (standard = true) => + createAuthenticationVirtualMachine(createInstructionSetBCH2021(standard)); diff --git a/src/lib/vm/instruction-sets/bch/bch.script-tests.spec.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021.script-tests.spec.ts similarity index 55% rename from src/lib/vm/instruction-sets/bch/bch.script-tests.spec.ts rename to src/lib/vm/instruction-sets/bch/2021/bch-2021.script-tests.spec.ts index 885c6bae..084b0755 100644 --- a/src/lib/vm/instruction-sets/bch/bch.script-tests.spec.ts +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021.script-tests.spec.ts @@ -1,47 +1,49 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/immutable-data */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import test from 'ava'; +import type { AuthenticationProgramStateBCH } from '../../../../lib'; import { - assembleBitcoinABCScript, - AuthenticationProgramStateBCH, + assembleBitcoinSatoshiScript, bigIntToBinUint64LE, createTestAuthenticationProgramBCH, + createVirtualMachineBCH2021, disassembleBytecodeBCH, - instantiateSha256, - instantiateVirtualMachineBCH, - InstructionSetBCH, stackItemIsTruthy, -} from '../../../lib'; + stringify, +} from '../../../../lib.js'; -import * as scriptTestsAddendum from './fixtures/bitcoin-abc/script-tests-addendum.json'; -import * as scriptTests from './fixtures/bitcoin-abc/script_tests.json'; +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import scriptTestsAddendum from './fixtures/bchn/script-tests-addendum.json' assert { type: 'json' }; +// eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules +import scriptTests from './fixtures/bchn/script_tests.json' assert { type: 'json' }; const tests = Object.values(scriptTests) .filter((e) => e.length !== 1 && e.length < 7) .map((expectation, testIndex) => { - const satoshis = + const valueSatoshis = typeof expectation[0] === 'string' ? 0 - : (expectation.shift() as number[])[0] * 1e8; + : (expectation.shift() as number[])[0]! * 1e8; return { expectedError: expectation[3] === 'OK' ? (false as const) : (expectation[3] as string), flags: { dirtyStack: false, failRequiresReview: false, useStrict: false }, lockingBytecodeText: expectation[1] as string, message: expectation[4] as string | undefined, - satoshis, testIndex, unlockingBytecodeText: expectation[0] as string, + valueSatoshis, }; }); const failRequiresReviewTests = scriptTestsAddendum.failRequiresReview; +const { requiresMinimalEncoding } = scriptTestsAddendum; const invalidUnlockTests = scriptTestsAddendum.invalidUnlock; const dirtyStackTests = scriptTestsAddendum.dirtyStack; const strictTests = scriptTestsAddendum.useStrict; -const expectedFailureTests = scriptTestsAddendum.fail.concat( - failRequiresReviewTests -); +const expectedFailureTests = scriptTestsAddendum.fail + .concat(failRequiresReviewTests) + .concat(requiresMinimalEncoding); /** * BCH doesn't currently use the `SCRIPT_VERIFY_MINIMALIF` flag (even in "strict * mode"), so there's no reason to implement or test it here. @@ -49,60 +51,51 @@ const expectedFailureTests = scriptTestsAddendum.fail.concat( const minimalIfTests = scriptTestsAddendum.minimalIf; const expectedPassTests = scriptTestsAddendum.pass.concat(minimalIfTests); invalidUnlockTests.map((index) => { - tests[ - index - ].lockingBytecodeText = `${tests[index].unlockingBytecodeText} ${tests[index].lockingBytecodeText}`; - tests[index].unlockingBytecodeText = ''; + tests[index]!.lockingBytecodeText = `${tests[index]!.unlockingBytecodeText} ${ + tests[index]!.lockingBytecodeText + }`; + tests[index]!.unlockingBytecodeText = ''; return undefined; }); -failRequiresReviewTests.map((index) => { - tests[index].flags.failRequiresReview = true; - return undefined; +failRequiresReviewTests.forEach((index) => { + tests[index]!.flags.failRequiresReview = true; }); -dirtyStackTests.map((index) => { - tests[index].flags.dirtyStack = true; - return undefined; +dirtyStackTests.forEach((index) => { + tests[index]!.flags.dirtyStack = true; }); -strictTests.map((index) => { - tests[index].flags.useStrict = true; - return undefined; +strictTests.forEach((index) => { + tests[index]!.flags.useStrict = true; }); -expectedFailureTests.map((index) => { - tests[index].expectedError = 'OVERRIDDEN_FAIL'; - return undefined; +expectedFailureTests.forEach((index) => { + tests[index]!.expectedError = 'OVERRIDDEN_FAIL'; }); -expectedPassTests.map((index) => { - tests[index].expectedError = false; - return undefined; +expectedPassTests.forEach((index) => { + tests[index]!.expectedError = false; }); const { overrides } = scriptTestsAddendum; -Object.entries(overrides.unlocking).map(([index, script]) => { - tests[Number(index)].unlockingBytecodeText = script; - return undefined; +Object.entries(overrides.unlocking).forEach(([index, script]) => { + tests[Number(index)]!.unlockingBytecodeText = script; }); -Object.entries(overrides.locking).map(([index, script]) => { - tests[Number(index)].lockingBytecodeText = script; - return undefined; +Object.entries(overrides.locking).forEach(([index, script]) => { + tests[Number(index)]!.lockingBytecodeText = script; }); const validateDirtyStackState = (state: AuthenticationProgramStateBCH) => state.error === undefined && - stackItemIsTruthy(state.stack[state.stack.length - 1]); + state.stack.length > 0 && + stackItemIsTruthy(state.stack[state.stack.length - 1]!); /** * Isolate a single test for debugging */ -// const pendingTests = tests.filter(e => e.testIndex === 1399); +// const pendingTests = tests.filter((e) => e.testIndex === 436); const pendingTests = tests; const elide = (text: string, length: number) => text.length > length ? `${text.slice(0, length)}...` : text; -const vmPromise = instantiateVirtualMachineBCH(InstructionSetBCH.BCH_2020_05); -const vmStrictPromise = instantiateVirtualMachineBCH( - InstructionSetBCH.BCH_2020_05_STRICT -); -const sha256Promise = instantiateSha256(); +const vmNonStandard = createVirtualMachineBCH2021(false); +const vmStandard = createVirtualMachineBCH2021(true); pendingTests.map((expectation) => { const description = `[script_tests] ${expectation.testIndex}/${ @@ -110,7 +103,9 @@ pendingTests.map((expectation) => { } – "${elide(expectation.unlockingBytecodeText, 100)}" | "${elide( expectation.lockingBytecodeText, 100 - )}"${expectation.message === undefined ? '' : ` # ${expectation.message}`}`; + )}" ${ + expectation.expectedError === false ? 'passes' : expectation.expectedError + } ${expectation.message === undefined ? '' : ` # ${expectation.message}`}`; // eslint-disable-next-line functional/no-conditional-statement if (expectation.flags.failRequiresReview) { test.todo(`Review failure: ${description}`); @@ -118,27 +113,23 @@ pendingTests.map((expectation) => { test( description, // eslint-disable-next-line complexity - async (t) => { - const unlockingBytecode = assembleBitcoinABCScript( + (t) => { + const unlockingBytecode = assembleBitcoinSatoshiScript( expectation.unlockingBytecodeText ); - const lockingBytecode = assembleBitcoinABCScript( + const lockingBytecode = assembleBitcoinSatoshiScript( expectation.lockingBytecodeText ); - const vm = expectation.flags.useStrict - ? await vmStrictPromise - : await vmPromise; - const sha256 = await sha256Promise; + const vm = expectation.flags.useStrict ? vmStandard : vmNonStandard; const program = createTestAuthenticationProgramBCH({ lockingBytecode, - satoshis: bigIntToBinUint64LE(BigInt(expectation.satoshis)), - sha256, unlockingBytecode, + valueSatoshis: bigIntToBinUint64LE(BigInt(expectation.valueSatoshis)), }); const result = vm.evaluate(program); const valid = expectation.flags.dirtyStack ? validateDirtyStackState(result) - : vm.verify(result) === true; + : vm.stateSuccess(result) === true; const pass = (valid && expectation.expectedError === false) || (!valid && expectation.expectedError !== false); @@ -147,7 +138,8 @@ pendingTests.map((expectation) => { t.log(`disassembled: "${disassembleBytecodeBCH(unlockingBytecode)}"`); t.log(`lockingBytecodeText: "${expectation.lockingBytecodeText}"`); t.log(`disassembled: "${disassembleBytecodeBCH(lockingBytecode)}"`); - t.log('result:', result); + t.log('result:', stringify(result)); + t.log('debug:', stringify(vm.debug(program))); if (expectation.expectedError === false) { t.fail('Expected a valid state, but this result is invalid.'); return; diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021.spec.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021.spec.ts new file mode 100644 index 00000000..d4b29d83 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021.spec.ts @@ -0,0 +1,557 @@ +import test from 'ava'; + +import type { AuthenticationProgramBCH, Output } from '../../../../lib'; +import { + bigIntToBinUint64LE, + createAuthenticationProgramStateCommon, + createCompilationContextCommonTesting, + createTestAuthenticationProgramBCH, + createVirtualMachineBCH2021, + decodeAuthenticationInstructions, + decodeTransactionCommon, + hexToBin, + OpcodesBCH2022, + stringify, +} from '../../../../lib.js'; + +const program = createCompilationContextCommonTesting({ + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: Uint8Array.of(1), + sequenceNumber: 0, + unlockingBytecode: Uint8Array.of(), + }, + ], +}) as AuthenticationProgramBCH; + +test('[BCH VM] vm.stateEvaluate: OP_2 OP_2 OP_ADD', (t) => { + const vm = createVirtualMachineBCH2021(); + const state = createAuthenticationProgramStateCommon({ + instructions: decodeAuthenticationInstructions( + Uint8Array.from([ + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_ADD, + ]) + ), + program, + stack: [], + }); + const result = vm.stateEvaluate(state); + t.deepEqual(result, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }); +}); + +test('[BCH VM] vm.stateDebug: OP_2 OP_2 OP_ADD', (t) => { + const vm = createVirtualMachineBCH2021(); + const state = createAuthenticationProgramStateCommon({ + instructions: decodeAuthenticationInstructions( + Uint8Array.from([ + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_ADD, + ]) + ), + program, + stack: [], + }); + const result = vm.stateDebug(state); + t.deepEqual(result, [ + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }, + ]); +}); + +test('[BCH VM] vm.stateStep through: OP_2 OP_2 OP_ADD', (t) => { + const vm = createVirtualMachineBCH2021(); + const state0 = createAuthenticationProgramStateCommon({ + instructions: decodeAuthenticationInstructions( + Uint8Array.from([ + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_ADD, + ]) + ), + program, + stack: [], + }); + const state1 = vm.stateStep(state0); + const state2 = vm.stateStep(state1); + t.deepEqual(vm.stateContinue(state2), true); + const state3 = vm.stateStep(state2); + t.deepEqual(vm.stateContinue(state3), false); + + t.deepEqual(state0, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }); + t.deepEqual(state1, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02)], + }); + t.deepEqual(state2, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], + }); + t.deepEqual(state3, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }); +}); + +test('[BCH VM] vm.evaluate: only lockingBytecode: OP_2 OP_2 OP_ADD', (t) => { + const vm = createVirtualMachineBCH2021(); + const testProgram = createTestAuthenticationProgramBCH({ + lockingBytecode: Uint8Array.from([ + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_ADD, + ]), + unlockingBytecode: Uint8Array.of(), + valueSatoshis: hexToBin('0000000000000000'), + }); + const result = vm.evaluate(testProgram); + t.deepEqual(result, { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }); +}); + +test('[BCH VM] vm.debug: only lockingBytecode: OP_2 OP_2 OP_ADD', (t) => { + const vm = createVirtualMachineBCH2021(); + const testProgram = createTestAuthenticationProgramBCH({ + lockingBytecode: Uint8Array.from([ + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_2, + OpcodesBCH2022.OP_ADD, + ]), + unlockingBytecode: Uint8Array.of(), + valueSatoshis: hexToBin('0000000000000000'), + }); + const result = vm.debug(testProgram); + t.deepEqual(result, [ + { + alternateStack: [], + controlStack: [], + instructions: [], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 1, + lastCodeSeparator: -1, + operationCount: 0, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 2, + lastCodeSeparator: -1, + operationCount: 0, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }, + { + alternateStack: [], + controlStack: [], + instructions: [ + { + opcode: 82, + }, + { + opcode: 82, + }, + { + opcode: 147, + }, + ], + ip: 3, + lastCodeSeparator: -1, + operationCount: 1, + program: testProgram, + signatureOperationsCount: 0, + signedMessages: [], + stack: [Uint8Array.of(0x04)], + }, + ]); +}); + +test('verifyTransaction', (t) => { + const vm = createVirtualMachineBCH2021(); + const valueSatoshis = 10000; + const transaction = decodeTransactionCommon( + hexToBin( + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' + ) + ); + if (typeof transaction === 'string') { + t.fail(transaction); + return; + } + + const sourceOutputs: Output[] = [ + { + lockingBytecode: hexToBin( + 'a9147ff682419764f7d0e6df75884c28334b9729864387' + ), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), + }, + ]; + + const result = vm.verify({ sourceOutputs, transaction }); + t.deepEqual(result, true, stringify(result)); +}); + +test('verifyTransaction: ', (t) => { + const vm = createVirtualMachineBCH2021(); + const valueSatoshis = 10000; + const transaction = decodeTransactionCommon( + hexToBin( + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' + ) + ); + if (typeof transaction === 'string') { + t.fail(transaction); + return; + } + + const sourceOutputs: Output[] = [ + { + lockingBytecode: hexToBin( + 'a9147ff682419764f7d0e6df75884c28334b9729864387' + ), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), + }, + ]; + + const result = vm.verify({ sourceOutputs, transaction }); + t.deepEqual(result, true, stringify(result)); +}); + +test('verifyTransaction: incorrect spentOutputs length', (t) => { + const vm = createVirtualMachineBCH2021(); + const transaction = decodeTransactionCommon( + hexToBin( + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' + ) + ); + if (typeof transaction === 'string') { + t.fail(transaction); + return; + } + + const sourceOutputs: Output[] = []; + + const result = vm.verify({ sourceOutputs, transaction }); + t.deepEqual( + result, + 'Unable to verify transaction: a single spent output must be provided for each transaction input.', + stringify(result) + ); +}); + +test('verifyTransaction: invalid input', (t) => { + const vm = createVirtualMachineBCH2021(); + const valueSatoshis = 10000; + const transaction = decodeTransactionCommon( + hexToBin( + '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' + ) + ); + if (typeof transaction === 'string') { + t.fail(transaction); + return; + } + + const sourceOutputs: Output[] = [ + { + lockingBytecode: hexToBin( + 'a9147ff682419764f7d0e6df75884c28334b9729864387' + ), + valueSatoshis: bigIntToBinUint64LE(BigInt(valueSatoshis)), + }, + ]; + + const result = vm.verify({ sourceOutputs, transaction }); + t.deepEqual( + result, + 'Error in evaluating input index 0: Program failed a signature verification with a non-null signature (violating the "NULLFAIL" rule).', + stringify(result) + ); +}); diff --git a/src/lib/vm/instruction-sets/bch/2021/bch-2021.ts b/src/lib/vm/instruction-sets/bch/2021/bch-2021.ts new file mode 100644 index 00000000..501fdeab --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/bch-2021.ts @@ -0,0 +1,6 @@ +export * from './bch-2021-descriptions.js'; +export * from './bch-2021-instruction-set.js'; +export * from './bch-2021-opcodes.js'; +export * from './bch-2021-types.js'; +export * from './bch-2021-vm.js'; +export * from './fixtures/bchn/bitcoin-satoshi-utils.js'; diff --git a/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/bitcoin-satoshi-utils.ts b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/bitcoin-satoshi-utils.ts new file mode 100644 index 00000000..2ef0173a --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/bitcoin-satoshi-utils.ts @@ -0,0 +1,54 @@ +import { + flattenBinArray, + hexToBin, + utf8ToBin, +} from '../../../../../../format/format.js'; +import { + bigIntToVmNumber, + encodeDataPush, + generateBytecodeMap, +} from '../../../../common/common.js'; +import { OpcodesBCH2021 } from '../../bch-2021-opcodes.js'; + +export const bitcoinSatoshiOpcodes = Object.entries( + generateBytecodeMap(OpcodesBCH2021) +).reduce>( + (acc, cur) => ({ ...acc, [cur[0].slice('OP_'.length)]: cur[1] }), + { + PUSHDATA1: Uint8Array.of(OpcodesBCH2021.OP_PUSHDATA_1), // eslint-disable-line @typescript-eslint/naming-convention + PUSHDATA2: Uint8Array.of(OpcodesBCH2021.OP_PUSHDATA_2), // eslint-disable-line @typescript-eslint/naming-convention + PUSHDATA4: Uint8Array.of(OpcodesBCH2021.OP_PUSHDATA_4), // eslint-disable-line @typescript-eslint/naming-convention + } +); + +/** + * Convert a string from the Satoshi implementation's `script_tests.json` + * text-format to bytecode. The string must be valid – this method attempts to + * convert all unmatched tokens to `BigInt`s. + * + * @privateRemarks + * This method doesn't use {@link compileScript} because of a slight + * incompatibility in the languages. In CashAssembly, BigIntLiterals are a + * primitive type, and must be surrounded by a push statement (e.g. `<100>`) to + * push a number to the stack. In the `script_tests.json` text-format, numbers + * are assumed to be pushed. We could implement a transformation after the + * compiler's parse step, but because this format doesn't require any other + * features of the compiler, we opt to implement this as a simple method. + * @param satoshiScript - the script in the Satoshi implementation's + * `script_tests.json` text format + */ +export const assembleBitcoinSatoshiScript = (satoshiScript: string) => + flattenBinArray( + satoshiScript + .split(' ') + .filter((token) => token !== '') + .map((token) => + token.startsWith('0x') + ? hexToBin(token.slice('0x'.length)) + : token.startsWith("'") + ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) + : bitcoinSatoshiOpcodes[token] === undefined + ? encodeDataPush(bigIntToVmNumber(BigInt(token))) + : bitcoinSatoshiOpcodes[token] + ) as Uint8Array[] + ); diff --git a/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/script-tests-addendum.json b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/script-tests-addendum.json new file mode 100644 index 00000000..9ca63754 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/script-tests-addendum.json @@ -0,0 +1,68 @@ +{ + "notes": "This file describes modifications made to script_tests.json prior to testing in bch.spec.ts. To achieve better test coverage in the C++ implementation, some tests rely on quirks of old VM versions, strange combinations of flags, and other situations that should never happen in production (e.g. invalid signature encoding post-BCH fork). Rather than re-implementing those quirks, we modify or skip tests that are no-longer relevant. TODO: 'failRequiresReview' is a list of tests that are currently expected to fail, but for which we need to validate that failure is the correct result in the modern VMs.", + "failRequiresReview": [ + 556, 557, 1190, 1192, 1194, 1196, 1198, 1201, 1203, 1223, 1241, 1253, 1263, + 1265, 1273, 1274, 1276, 1278, 1279, 1282, 1308, 1310, 1311, 1339, 1340, + 1341, 1343, 1344, 1345, 1346, 1349, 1350, 1351, 1353, 1354, 1355, 1356, + 1383, 1385, 1387, 1389, 1394, 1396, 1398, 1400, 1404, 1405, 1406, 1414, 1416 + ], + "overrides": { + "locking": { + "204": "NOP1 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", + "205": "NOP1 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 'NOP_1_to_10' EQUAL" + }, + "unlocking": { + "205": "'NOP_1_to_10'", + "282": "1 2 3 4 5", + "283": "1", + "284": "1" + } + }, + "invalidUnlock": [ + 21, 56, 57, 58, 59, 60, 61, 117, 118, 119, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 169, 170, 171, 172, 173, 174, 175, 176, + 184, 185, 186, 280, 286, 324, 337, 378, 379, 382, 383, 384, 385, 386, 387, + 388, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 727 + ], + "dirtyStack": [ + 60, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 80, 82, 83, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 282, 283, 284, 313, 314, 331, + 332, 333, 334, 335, 336, 337, 339, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 438, 440, 441, 446, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 800, 829 + ], + "requiresMinimalEncoding": [ + 15, 16, 17, 18, 19, 20, 200, 203, 287, 299, 316, 317, 319, 320, 321, 322, + 323, 441, 442, 443, 444, 445, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 465, 466, 467, 468, 469, 470, 471, + 472, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553 + ], + "fail": [ + 12, 380, 381, 436, 558, 559, 560, 561, 562, 563, 564, 565, 1159, 1160, 1161, + 1162, 1163, 1164, 1167, 1168, 1169, 1171, 1172, 1174, 1175, 1199, 1205, + 1207, 1209, 1211, 1215, 1228, 1230, 1236, 1240, 1242, 1244, 1246, 1250, + 1252, 1255, 1257, 1259, 1261, 1267, 1269, 1270, 1286, 1288, 1290, 1292, + 1294, 1300, 1302, 1304, 1316, 1318, 1320, 1322, 1324, 1330, 1332, 1334, + 1347, 1367, 1369, 1401, 1402, 1409, 1410, 1412, 1479, 1480, 1481, 1483, + 1485, 1488, 1490 + ], + "pass": [ + 900, 903, 904, 905, 906, 907, 908, 909, 911, 1358, 1362, 1370, 1374, 1419, + 1422, 1460 + ], + "minimalIf": [1447, 1449, 1460, 1463, 1465, 1477], + "useStrict": [ + 593, 910, 1079, 1080, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, + 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, + 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, + 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, + 1153, 1154, 1155, 1156, 1157, 1158 + ] +} diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/script_tests.json b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/script_tests.json similarity index 100% rename from src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/script_tests.json rename to src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/script_tests.json diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/sighash.json b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/sighash.json similarity index 100% rename from src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/sighash.json rename to src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/sighash.json diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/tx_invalid.json b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/tx_invalid.json similarity index 100% rename from src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/tx_invalid.json rename to src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/tx_invalid.json diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/tx_valid.json b/src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/tx_valid.json similarity index 100% rename from src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/tx_valid.json rename to src/lib/vm/instruction-sets/bch/2021/fixtures/bchn/tx_valid.json diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-descriptions.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-descriptions.ts new file mode 100644 index 00000000..ccee00c3 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-descriptions.ts @@ -0,0 +1,210 @@ +export enum OpcodeDescriptionsBCH2022 { + OP_0 = 'Push the VM Number 0 onto the stack.', + OP_PUSHBYTES_1 = 'Push the next byte onto the stack.', + OP_PUSHBYTES_2 = 'Push the next 2 bytes onto the stack.', + OP_PUSHBYTES_3 = 'Push the next 3 bytes onto the stack.', + OP_PUSHBYTES_4 = 'Push the next 4 bytes onto the stack.', + OP_PUSHBYTES_5 = 'Push the next 5 bytes onto the stack.', + OP_PUSHBYTES_6 = 'Push the next 6 bytes onto the stack.', + OP_PUSHBYTES_7 = 'Push the next 7 bytes onto the stack.', + OP_PUSHBYTES_8 = 'Push the next 8 bytes onto the stack.', + OP_PUSHBYTES_9 = 'Push the next 9 bytes onto the stack.', + OP_PUSHBYTES_10 = 'Push the next 10 bytes onto the stack.', + OP_PUSHBYTES_11 = 'Push the next 11 bytes onto the stack.', + OP_PUSHBYTES_12 = 'Push the next 12 bytes onto the stack.', + OP_PUSHBYTES_13 = 'Push the next 13 bytes onto the stack.', + OP_PUSHBYTES_14 = 'Push the next 14 bytes onto the stack.', + OP_PUSHBYTES_15 = 'Push the next 15 bytes onto the stack.', + OP_PUSHBYTES_16 = 'Push the next 16 bytes onto the stack.', + OP_PUSHBYTES_17 = 'Push the next 17 bytes onto the stack.', + OP_PUSHBYTES_18 = 'Push the next 18 bytes onto the stack.', + OP_PUSHBYTES_19 = 'Push the next 19 bytes onto the stack.', + OP_PUSHBYTES_20 = 'Push the next 20 bytes onto the stack.', + OP_PUSHBYTES_21 = 'Push the next 21 bytes onto the stack.', + OP_PUSHBYTES_22 = 'Push the next 22 bytes onto the stack.', + OP_PUSHBYTES_23 = 'Push the next 23 bytes onto the stack.', + OP_PUSHBYTES_24 = 'Push the next 24 bytes onto the stack.', + OP_PUSHBYTES_25 = 'Push the next 25 bytes onto the stack.', + OP_PUSHBYTES_26 = 'Push the next 26 bytes onto the stack.', + OP_PUSHBYTES_27 = 'Push the next 27 bytes onto the stack.', + OP_PUSHBYTES_28 = 'Push the next 28 bytes onto the stack.', + OP_PUSHBYTES_29 = 'Push the next 29 bytes onto the stack.', + OP_PUSHBYTES_30 = 'Push the next 30 bytes onto the stack.', + OP_PUSHBYTES_31 = 'Push the next 31 bytes onto the stack.', + OP_PUSHBYTES_32 = 'Push the next 32 bytes onto the stack.', + OP_PUSHBYTES_33 = 'Push the next 33 bytes onto the stack.', + OP_PUSHBYTES_34 = 'Push the next 34 bytes onto the stack.', + OP_PUSHBYTES_35 = 'Push the next 35 bytes onto the stack.', + OP_PUSHBYTES_36 = 'Push the next 36 bytes onto the stack.', + OP_PUSHBYTES_37 = 'Push the next 37 bytes onto the stack.', + OP_PUSHBYTES_38 = 'Push the next 38 bytes onto the stack.', + OP_PUSHBYTES_39 = 'Push the next 39 bytes onto the stack.', + OP_PUSHBYTES_40 = 'Push the next 40 bytes onto the stack.', + OP_PUSHBYTES_41 = 'Push the next 41 bytes onto the stack.', + OP_PUSHBYTES_42 = 'Push the next 42 bytes onto the stack.', + OP_PUSHBYTES_43 = 'Push the next 43 bytes onto the stack.', + OP_PUSHBYTES_44 = 'Push the next 44 bytes onto the stack.', + OP_PUSHBYTES_45 = 'Push the next 45 bytes onto the stack.', + OP_PUSHBYTES_46 = 'Push the next 46 bytes onto the stack.', + OP_PUSHBYTES_47 = 'Push the next 47 bytes onto the stack.', + OP_PUSHBYTES_48 = 'Push the next 48 bytes onto the stack.', + OP_PUSHBYTES_49 = 'Push the next 49 bytes onto the stack.', + OP_PUSHBYTES_50 = 'Push the next 50 bytes onto the stack.', + OP_PUSHBYTES_51 = 'Push the next 51 bytes onto the stack.', + OP_PUSHBYTES_52 = 'Push the next 52 bytes onto the stack.', + OP_PUSHBYTES_53 = 'Push the next 53 bytes onto the stack.', + OP_PUSHBYTES_54 = 'Push the next 54 bytes onto the stack.', + OP_PUSHBYTES_55 = 'Push the next 55 bytes onto the stack.', + OP_PUSHBYTES_56 = 'Push the next 56 bytes onto the stack.', + OP_PUSHBYTES_57 = 'Push the next 57 bytes onto the stack.', + OP_PUSHBYTES_58 = 'Push the next 58 bytes onto the stack.', + OP_PUSHBYTES_59 = 'Push the next 59 bytes onto the stack.', + OP_PUSHBYTES_60 = 'Push the next 60 bytes onto the stack.', + OP_PUSHBYTES_61 = 'Push the next 61 bytes onto the stack.', + OP_PUSHBYTES_62 = 'Push the next 62 bytes onto the stack.', + OP_PUSHBYTES_63 = 'Push the next 63 bytes onto the stack.', + OP_PUSHBYTES_64 = 'Push the next 64 bytes onto the stack.', + OP_PUSHBYTES_65 = 'Push the next 65 bytes onto the stack.', + OP_PUSHBYTES_66 = 'Push the next 66 bytes onto the stack.', + OP_PUSHBYTES_67 = 'Push the next 67 bytes onto the stack.', + OP_PUSHBYTES_68 = 'Push the next 68 bytes onto the stack.', + OP_PUSHBYTES_69 = 'Push the next 69 bytes onto the stack.', + OP_PUSHBYTES_70 = 'Push the next 70 bytes onto the stack.', + OP_PUSHBYTES_71 = 'Push the next 71 bytes onto the stack.', + OP_PUSHBYTES_72 = 'Push the next 72 bytes onto the stack.', + OP_PUSHBYTES_73 = 'Push the next 73 bytes onto the stack.', + OP_PUSHBYTES_74 = 'Push the next 74 bytes onto the stack.', + OP_PUSHBYTES_75 = 'Push the next 75 bytes onto the stack.', + OP_PUSHDATA_1 = 'Read the next Uint8 and push that number of bytes onto the stack.', + OP_PUSHDATA_2 = 'Read the next little-endian Uint16 and push that number of bytes onto the stack.', + OP_PUSHDATA_4 = 'Read the next little-endian Uint32 and push that number of bytes onto the stack.', + OP_1NEGATE = 'Push the VM Number -1 onto the stack.', + OP_RESERVED = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED does not count toward the opcode limit.', + OP_1 = 'Push a 1 (VM Number) onto the stack.', + OP_2 = 'Push a 2 (VM Number) onto the stack.', + OP_3 = 'Push a 3 (VM Number) onto the stack.', + OP_4 = 'Push a 4 (VM Number) onto the stack.', + OP_5 = 'Push a 5 (VM Number) onto the stack.', + OP_6 = 'Push a 6 (VM Number) onto the stack.', + OP_7 = 'Push a 7 (VM Number) onto the stack.', + OP_8 = 'Push a 8 (VM Number) onto the stack.', + OP_9 = 'Push a 9 (VM Number) onto the stack.', + OP_10 = 'Push a 10 (VM Number) onto the stack.', + OP_11 = 'Push a 11 (VM Number) onto the stack.', + OP_12 = 'Push a 12 (VM Number) onto the stack.', + OP_13 = 'Push a 13 (VM Number) onto the stack.', + OP_14 = 'Push a 14 (VM Number) onto the stack.', + OP_15 = 'Push a 15 (VM Number) onto the stack.', + OP_16 = 'Push a 16 (VM Number) onto the stack.', + OP_NOP = 'No operation. Note: OP_NOP counts toward the opcode limit.', + OP_VER = 'Error unless found in an unexecuted conditional branch. Note: OP_VER counts toward the opcode limit. (Historically, this pushed a protocol version number to the stack.)', + OP_IF = 'Pop the top item from the stack. If it is not "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', + OP_NOTIF = 'Pop the top item from the stack. If it is "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', + OP_VERIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_IF.)', + OP_VERNOTIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_NOTIF.)', + OP_ELSE = 'Invert conditional evaluation within the current OP_IF ... OP_ENDIF block. (If evaluation is enabled, disable it, if it is disabled, enable it.)', + OP_ENDIF = 'End the current OP_IF/OP_NOTIF ... OP_ENDIF block.', + OP_VERIFY = 'Pop the top item from the stack and error if it isn\'t "truthy".', + OP_RETURN = 'Error when executed.', + OP_TOALTSTACK = 'Pop the top item from the stack and push it onto the alternate stack.', + OP_FROMALTSTACK = 'Pop the top item from the alternate stack and push it onto the stack.', + OP_2DROP = 'Pop the top 2 items from the stack and discard them.', + OP_2DUP = 'Duplicate the top 2 items on the stack. (E.g. [a, b] -> [a, b, a, b])', + OP_3DUP = 'Duplicate the top 3 items on the stack. (E.g. [a, b, c] -> [a, b, c, a, b, c])', + OP_2OVER = 'Duplicate the 2 items beginning at a depth of 2 on the stack. (E.g. [a, b, c, d] -> [a, b, c, d, a, b])', + OP_2ROT = 'Rotate the top 6 items on the stack, bringing the fifth and sixth items to the top. (E.g. [a, b, c, d, e, f] -> [c, d, e, f, a, b])', + OP_2SWAP = 'Swap the positions of the top two pairs of items on the stack. (E.g. [a, b, c, d] -> [c, d, a, b])', + OP_IFDUP = 'If the top item on the stack is "truthy", duplicate it.', + OP_DEPTH = 'Push the current number of stack items as a VM Number.', + OP_DROP = 'Pop the top item from the stack and discard it. (E.g. [a] -> [])', + OP_DUP = 'Duplicate the top item on the stack. (E.g. [a] -> [a, a])', + OP_NIP = 'Remove the second-to-top item from the stack. (E.g. [a, b] -> [b])', + OP_OVER = 'Duplicate the second-to-top item on the stack. (E.g. [a, b] -> [a, b, a])', + OP_PICK = 'Pop the top item from the stack as a VM Number. Duplicate the item at that depth (zero-indexed), placing it on top of the stack. (E.g. [a, b, c, 2] -> [a, b, c, a])', + OP_ROLL = 'Pop the top item from the stack as a VM Number. Move the item at that depth (zero-indexed) to the top of the stack. (E.g. [a, b, c, 2] -> [b, c, a])', + OP_ROT = 'Rotate the top 3 items on the stack, bringing the third item to the top. (E.g. [a, b, c] -> [b, c, a])', + OP_SWAP = 'Swap the top two items on the stack. (E.g. [a, b] -> [b, a])', + OP_TUCK = 'Duplicate the item at the top of the stack, inserting it below the second-to-top item. (E.g. [a, b] -> [b, a, b])', + OP_CAT = 'Pop the top 2 items from the stack and concatenate them, pushing the result.', + OP_SPLIT = 'Pop the top item from the stack as an index (VM Number) and the next item as a byte array. Split the byte array into two stack items at the index (zero-based), pushing the results.', + OP_NUM2BIN = 'Pop the top item from the stack as an item length (VM Number) and the next item as a VM Number (without encoding restrictions). Re-encode the number using a byte array of the provided length, filling any unused bytes with zeros, then push the result. (If the requested length is too short to encode the number, error.)', + OP_BIN2NUM = "Pop the top item from the stack as a VM Number without encoding restrictions. Minimally-encode the number and push the result. (If the number can't be encoded in 4 bytes or less, error.)", + OP_SIZE = 'Push the byte-length of the top stack item as a VM Number.', + OP_INVERT = 'Error, even when found in an unexecuted conditional branch. (Historically, this flipped all the bits in a stack item.)', + OP_AND = 'Pop the top 2 items from the stack and perform a bitwise AND on each byte, pushing the result. If the length of the items are not equal, error.', + OP_OR = 'Pop the top 2 items from the stack and perform a bitwise OR on each byte, pushing the result. If the length of the items are not equal, error.', + OP_XOR = 'Pop the top 2 items from the stack and perform a bitwise XOR on each byte, pushing the result. If the length of the items are not equal, error.', + OP_EQUAL = 'Pop the top two items from the stack and compare them byte-by-byte. If they are the same, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_EQUALVERIFY = 'Pop the top two items from the stack and compare them byte-by-byte. If the values are different, error. (This operation is a combination of OP_EQUAL followed by OP_VERIFY.)', + OP_RESERVED1 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED1 counts toward the opcode limit.', + OP_RESERVED2 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED2 counts toward the opcode limit.', + OP_1ADD = 'Pop the top item from the stack as a VM Number, add 1, then push the result.', + OP_1SUB = 'Pop the top item from the stack as a VM Number, subtract 1, then push the result.', + OP_2MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied a VM Number by 2.)', + OP_2DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided a VM Number by 2.)', + OP_NEGATE = 'Pop the top item from the stack as a VM Number, negate it, then push the result.', + OP_ABS = 'Pop the top item from the stack as a VM Number, take its absolute value, then push the result.', + OP_NOT = 'Pop the top item from the stack as a VM Number. If its value is 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_0NOTEQUAL = 'Pop the top item from the stack as a VM Number. If its value is not 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_ADD = 'Pop the top two items from the stack as VM Numbers. Add them, then push the result.', + OP_SUB = 'Pop the top two items from the stack as VM Numbers. Subtract the top item from the second item, then push the result.', + OP_MUL = 'Pop the top two items from the stack as VM Numbers. Multiply them, then push the result.', + OP_DIV = 'Pop the top item from the stack as a denominator (VM Number) and the next as a numerator (VM Number). Divide and push the result to the stack.', + OP_MOD = 'Pop the top item from the stack as a denominator (VM Number) and the next as a numerator (VM Number). Divide and push the remainder to the stack.', + OP_LSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, left bit shift.)', + OP_RSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, right bit shift.)', + OP_BOOLAND = 'Pop the top two items from the stack as VM Numbers. If neither value is a 0 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_BOOLOR = 'Pop the top two items from the stack as VM Numbers. If either value is a 1 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUALVERIFY = 'Pop the top two items from the stack as VM Numbers. If the values are different, error. (This operation is a combination of OP_NUMEQUAL followed by OP_VERIFY.)', + OP_NUMNOTEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are not equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is less than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is less than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_MIN = 'Pop the top two items from the stack as VM Numbers. Push the smaller of the two numbers.', + OP_MAX = 'Pop the top two items from the stack as VM Numbers. Push the larger of the two numbers.', + OP_WITHIN = 'Pop the top three items from the stack as VM Numbers. If the top number is within the range defined by the following two numbers (left-inclusive), push a 1 (VM Number). Otherwise, push a 0 (VM Number). (E.g. for [a, b, c]: if (b <= a), and (a < c), [1]. Else [0].)', + OP_RIPEMD160 = 'Pop the top item from the stack and pass it through ripemd160, pushing the result onto the stack.', + OP_SHA1 = 'Pop the top item from the stack and pass it through sha1, pushing the result onto the stack.', + OP_SHA256 = 'Pop the top item from the stack and pass it through sha256, pushing the result onto the stack.', + OP_HASH160 = 'Pop the top item from the stack and pass it through sha256, then ripemd160, pushing the result onto the stack.', + OP_HASH256 = 'Pop the top item from the stack and pass it through sha256 twice, pushing the result onto the stack.', + OP_CODESEPARATOR = "Update the value of lastCodeSeparator to the instruction pointer's current value. (This reduces the coverage of signing serializations used in signature verification operations.)", + OP_CHECKSIG = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is valid, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKSIGVERIFY = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is not valid, error. (This operation is a combination of OP_CHECKSIG followed by OP_VERIFY.)', + OP_CHECKMULTISIG = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, pop a final VM Number that must be 0 due to a protocol bug. Checking each signature against each public key in order, if all signatures are valid – and the required number of signatures have been provided – push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKMULTISIGVERIFY = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, (due to a protocol bug) pop an unused final VM Number that must be 0. Checking each signature against each public key in order, if any signatures are invalid – or the required number of signatures have not been provided – error. (This operation is a combination of OP_CHECKMULTISIG followed by OP_VERIFY.)', + OP_NOP1 = 'No operation (reserved for future expansion). Note: OP_NOP1 counts toward the opcode limit.', + OP_CHECKLOCKTIMEVERIFY = "Verify the transaction occurs after an absolute block time or height: read the top item on the stack as a VM Number (without removing it), and compare it to the transaction's locktime. If the required locktime has not passed, or if locktime has been disabled for this input by a maximized sequence number, error.", + OP_CHECKSEQUENCEVERIFY = 'Verify the transaction occurs after the output being spent has "aged" by a relative block time or block height since it was created: read the top item on the stack as a VM Number (without removing it), and compare it to the age encoded in the input\'s sequence number. If the required relative locktime has not passed, or if relative locktime has been disabled by the sequence number or the transaction version, error.', + OP_NOP4 = 'No operation (reserved for future expansion). Note: OP_NOP4 counts toward the opcode limit.', + OP_NOP6 = 'No operation (reserved for future expansion). Note: OP_NOP6 counts toward the opcode limit.', + OP_NOP5 = 'No operation (reserved for future expansion). Note: OP_NOP5 counts toward the opcode limit.', + OP_NOP7 = 'No operation (reserved for future expansion). Note: OP_NOP7 counts toward the opcode limit.', + OP_NOP8 = 'No operation (reserved for future expansion). Note: OP_NOP8 counts toward the opcode limit.', + OP_NOP9 = 'No operation (reserved for future expansion). Note: OP_NOP9 counts toward the opcode limit.', + OP_NOP10 = 'No operation (reserved for future expansion). Note: OP_NOP10 counts toward the opcode limit.', + OP_CHECKDATASIG = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is valid, push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKDATASIGVERIFY = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is not valid, error. (This operation is a combination of OP_CHECKDATASIG followed by OP_VERIFY.)', + OP_REVERSEBYTES = 'Pop the top item from the stack and reverse it, pushing the result.', + OP_INPUTINDEX = 'Push the index of the input being evaluated to the stack as a VM Number.', + OP_ACTIVEBYTECODE = 'Push the bytecode currently being evaluated, beginning after the last executed OP_CODESEPARATOR, to the stack. For Pay-to-Script-Hash (P2SH) evaluations, this is the redeem bytecode of the Unspent Transaction Output (UTXO) being spent; for all other evaluations, this is the locking bytecode of the UTXO being spent.', + OP_TXVERSION = 'Push the version of the current transaction to the stack as a VM Number.', + OP_TXINPUTCOUNT = 'Push the count of inputs in the current transaction to the stack as a VM Number.', + OP_TXOUTPUTCOUNT = 'Push the count of outputs in the current transaction to the stack as a VM Number.', + OP_TXLOCKTIME = 'Push the locktime of the current transaction to the stack as a VM Number.', + OP_UTXOVALUE = 'Pop the top item from the stack as an input index (VM Number). Push the value (in satoshis) of the Unspent Transaction Output (UTXO) spent by that input to the stack as a VM Number.', + OP_UTXOBYTECODE = 'Pop the top item from the stack as an input index (VM Number). Push the full locking bytecode of the Unspent Transaction Output (UTXO) spent by that input to the stack.', + OP_OUTPOINTTXHASH = 'Pop the top item from the stack as an input index (VM Number). From that input, push the outpoint transaction hash – the hash of the transaction that created the Unspent Transaction Output (UTXO) that is being spent – to the stack in OP_HASH256 byte order.', + OP_OUTPOINTINDEX = 'Pop the top item from the stack as an input index (VM Number). From that input, push the outpoint index – the index of the output in the transaction that created the Unspent Transaction Output (UTXO) that is being spent – to the stack as a VM Number.', + OP_INPUTBYTECODE = 'Pop the top item from the stack as an input index (VM Number). Push the unlocking bytecode of the input at that index to the stack.', + OP_INPUTSEQUENCENUMBER = 'Pop the top item from the stack as an input index (VM Number). Push the sequence number of the input at that index to the stack as a VM Number.', + OP_OUTPUTVALUE = 'Pop the top item from the stack as an output index (VM Number). Push the value (in satoshis) of the output at that index to the stack as a VM Number.', + OP_OUTPUTBYTECODE = 'Pop the top item from the stack as an output index (VM Number). Push the locking bytecode of the output at that index to the stack.', +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const OpcodeDescriptionsBCH = OpcodeDescriptionsBCH2022; +// eslint-disable-next-line @typescript-eslint/naming-convention +export const OpcodeDescriptions = OpcodeDescriptionsBCH; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-errors.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-errors.ts new file mode 100644 index 00000000..30103ae5 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-errors.ts @@ -0,0 +1,6 @@ +export enum AuthenticationErrorBCH2022 { + exceededMaximumVmNumberLength = 'Program attempted an OP_BIN2NUM operation on a byte sequence that cannot be encoded within the maximum VM Number length (8 bytes).', +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const AuthenticationErrorBCH = AuthenticationErrorBCH2022; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts new file mode 100644 index 00000000..88488395 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts @@ -0,0 +1,638 @@ +import { isPayToScriptHash20 } from '../../../../address/address.js'; +import { + ripemd160 as internalRipemd160, + secp256k1 as internalSecp256k1, + sha1 as internalSha1, + sha256 as internalSha256, +} from '../../../../crypto/default-crypto-instances.js'; +import type { + AuthenticationProgramBCH, + AuthenticationProgramStateBCH, + InstructionSet, + ResolvedTransactionBCH, + Ripemd160, + Secp256k1, + Sha1, + Sha256, +} from '../../../../lib'; +import { encodeTransactionBCH } from '../../../../message/message.js'; +import { + applyError, + AuthenticationErrorCommon, + authenticationInstructionsAreMalformed, + cloneAuthenticationProgramStateBCH, + cloneStack, + conditionallyEvaluate, + ConsensusBCH, + createAuthenticationProgramStateCommon, + decodeAuthenticationInstructions, + disabledOperation, + incrementOperationCount, + isArbitraryDataOutput, + isPushOnly, + isStandardOutputBytecode, + isWitnessProgram, + mapOverOperations, + op0NotEqual, + op1Add, + op1Sub, + op2Drop, + op2Dup, + op2Over, + op2Rot, + op2Swap, + op3Dup, + opAbs, + opActiveBytecode, + opAdd, + opAnd, + opBin2Num, + opBoolAnd, + opBoolOr, + opCat, + opCheckDataSig, + opCheckDataSigVerify, + opCheckLockTimeVerify, + opCheckMultiSig, + opCheckMultiSigVerify, + opCheckSequenceVerify, + opCheckSig, + opCheckSigVerify, + opCodeSeparator, + opDepth, + opDiv, + opDrop, + opDup, + opElse, + opEndIf, + opEqual, + opEqualVerify, + opFromAltStack, + opGreaterThan, + opGreaterThanOrEqual, + opHash160, + opHash256, + opIf, + opIfDup, + opInputBytecode, + opInputIndex, + opInputSequenceNumber, + opLessThan, + opLessThanOrEqual, + opMax, + opMin, + opMod, + opMul, + opNegate, + opNip, + opNop, + opNopDisallowed, + opNot, + opNotIf, + opNum2Bin, + opNumEqual, + opNumEqualVerify, + opNumNotEqual, + opOr, + opOutpointIndex, + opOutpointTxHash, + opOutputBytecode, + opOutputValue, + opOver, + opPick, + opReturn, + opReverseBytes, + opRipemd160, + opRoll, + opRot, + opSha1, + opSha256, + opSize, + opSplit, + opSub, + opSwap, + opToAltStack, + opTuck, + opTxInputCount, + opTxLocktime, + opTxOutputCount, + opTxVersion, + opUtxoBytecode, + opUtxoValue, + opVerify, + opWithin, + opXor, + pushNumberOperation, + pushOperation, + reservedOperation, + stackItemIsTruthy, + undefinedOperation, +} from '../../common/common.js'; + +import { OpcodesBCH } from './bch-2022-opcodes.js'; + +/** + * create an instance of the BCH 2022 virtual machine instruction set. + * + * @param standard - If `true`, the additional `isStandard` validations will be + * enabled. Transactions that fail these rules are often called "non-standard" + * and can technically be included by miners in valid blocks, but most network + * nodes will refuse to relay them. (Default: `true`) + */ +export const createInstructionSetBCH2022 = ( + standard = true, + { + ripemd160, + secp256k1, + sha1, + sha256, + }: { + /** + * a Ripemd160 implementation + */ + ripemd160: { hash: Ripemd160['hash'] }; + /** + * a Secp256k1 implementation + */ + secp256k1: { + verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + /** + * a Sha1 implementation + */ + sha1: { hash: Sha1['hash'] }; + /** + * a Sha256 implementation + */ + sha256: { hash: Sha256['hash'] }; + } = { + ripemd160: internalRipemd160, + secp256k1: internalSecp256k1, + sha1: internalSha1, + sha256: internalSha256, + } +): InstructionSet< + ResolvedTransactionBCH, + AuthenticationProgramBCH, + AuthenticationProgramStateBCH +> => { + const push = pushOperation(); + return { + clone: cloneAuthenticationProgramStateBCH, + continue: (state) => + state.error === undefined && state.ip < state.instructions.length, + // eslint-disable-next-line complexity + evaluate: (program, stateEvaluate) => { + const { unlockingBytecode } = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + program.transaction.inputs[program.inputIndex]!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { lockingBytecode } = program.sourceOutputs[program.inputIndex]!; + const unlockingInstructions = + decodeAuthenticationInstructions(unlockingBytecode); + const lockingInstructions = + decodeAuthenticationInstructions(lockingBytecode); + const initialState = createAuthenticationProgramStateCommon({ + instructions: unlockingInstructions, + program, + stack: [], + }); + + if (unlockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { + return applyError( + initialState, + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).` + ); + } + if (authenticationInstructionsAreMalformed(unlockingInstructions)) { + return applyError( + initialState, + AuthenticationErrorCommon.malformedUnlockingBytecode + ); + } + if (lockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { + return applyError( + initialState, + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + ); + } + if (authenticationInstructionsAreMalformed(lockingInstructions)) { + return applyError( + initialState, + AuthenticationErrorCommon.malformedLockingBytecode + ); + } + if (standard && !isPushOnly(unlockingBytecode)) { + return applyError( + initialState, + AuthenticationErrorCommon.requiresPushOnly + ); + } + const unlockingResult = stateEvaluate(initialState); + if (unlockingResult.error !== undefined) { + return unlockingResult; + } + const lockingResult = stateEvaluate( + createAuthenticationProgramStateCommon({ + instructions: lockingInstructions, + program, + stack: unlockingResult.stack, + }) + ); + if (!isPayToScriptHash20(lockingBytecode)) { + return lockingResult; + } + + const p2shStack = cloneStack(unlockingResult.stack); + // eslint-disable-next-line functional/immutable-data + const p2shScript = p2shStack.pop() ?? Uint8Array.of(); + + if (p2shStack.length === 0 && isWitnessProgram(p2shScript)) { + return lockingResult; + } + + const p2shInstructions = decodeAuthenticationInstructions(p2shScript); + return authenticationInstructionsAreMalformed(p2shInstructions) + ? { + ...lockingResult, + error: AuthenticationErrorCommon.malformedP2shBytecode, + } + : stateEvaluate( + createAuthenticationProgramStateCommon({ + instructions: p2shInstructions, + program, + stack: p2shStack, + }) + ); + }, + every: (state) => + // TODO: implement sigchecks https://gitlab.com/bitcoin-cash-node/bchn-sw/bitcoincash-upgrade-specifications/-/blob/master/spec/2020-05-15-sigchecks.md + state.stack.length + state.alternateStack.length > + ConsensusBCH.maximumStackDepth + ? applyError(state, AuthenticationErrorCommon.exceededMaximumStackDepth) + : state.operationCount > ConsensusBCH.maximumOperationCount + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount + ) + : state, + operations: { + [OpcodesBCH.OP_0]: push, + [OpcodesBCH.OP_PUSHBYTES_1]: push, + [OpcodesBCH.OP_PUSHBYTES_2]: push, + [OpcodesBCH.OP_PUSHBYTES_3]: push, + [OpcodesBCH.OP_PUSHBYTES_4]: push, + [OpcodesBCH.OP_PUSHBYTES_5]: push, + [OpcodesBCH.OP_PUSHBYTES_6]: push, + [OpcodesBCH.OP_PUSHBYTES_7]: push, + [OpcodesBCH.OP_PUSHBYTES_8]: push, + [OpcodesBCH.OP_PUSHBYTES_9]: push, + [OpcodesBCH.OP_PUSHBYTES_10]: push, + [OpcodesBCH.OP_PUSHBYTES_11]: push, + [OpcodesBCH.OP_PUSHBYTES_12]: push, + [OpcodesBCH.OP_PUSHBYTES_13]: push, + [OpcodesBCH.OP_PUSHBYTES_14]: push, + [OpcodesBCH.OP_PUSHBYTES_15]: push, + [OpcodesBCH.OP_PUSHBYTES_16]: push, + [OpcodesBCH.OP_PUSHBYTES_17]: push, + [OpcodesBCH.OP_PUSHBYTES_18]: push, + [OpcodesBCH.OP_PUSHBYTES_19]: push, + [OpcodesBCH.OP_PUSHBYTES_20]: push, + [OpcodesBCH.OP_PUSHBYTES_21]: push, + [OpcodesBCH.OP_PUSHBYTES_22]: push, + [OpcodesBCH.OP_PUSHBYTES_23]: push, + [OpcodesBCH.OP_PUSHBYTES_24]: push, + [OpcodesBCH.OP_PUSHBYTES_25]: push, + [OpcodesBCH.OP_PUSHBYTES_26]: push, + [OpcodesBCH.OP_PUSHBYTES_27]: push, + [OpcodesBCH.OP_PUSHBYTES_28]: push, + [OpcodesBCH.OP_PUSHBYTES_29]: push, + [OpcodesBCH.OP_PUSHBYTES_30]: push, + [OpcodesBCH.OP_PUSHBYTES_31]: push, + [OpcodesBCH.OP_PUSHBYTES_32]: push, + [OpcodesBCH.OP_PUSHBYTES_33]: push, + [OpcodesBCH.OP_PUSHBYTES_34]: push, + [OpcodesBCH.OP_PUSHBYTES_35]: push, + [OpcodesBCH.OP_PUSHBYTES_36]: push, + [OpcodesBCH.OP_PUSHBYTES_37]: push, + [OpcodesBCH.OP_PUSHBYTES_38]: push, + [OpcodesBCH.OP_PUSHBYTES_39]: push, + [OpcodesBCH.OP_PUSHBYTES_40]: push, + [OpcodesBCH.OP_PUSHBYTES_41]: push, + [OpcodesBCH.OP_PUSHBYTES_42]: push, + [OpcodesBCH.OP_PUSHBYTES_43]: push, + [OpcodesBCH.OP_PUSHBYTES_44]: push, + [OpcodesBCH.OP_PUSHBYTES_45]: push, + [OpcodesBCH.OP_PUSHBYTES_46]: push, + [OpcodesBCH.OP_PUSHBYTES_47]: push, + [OpcodesBCH.OP_PUSHBYTES_48]: push, + [OpcodesBCH.OP_PUSHBYTES_49]: push, + [OpcodesBCH.OP_PUSHBYTES_50]: push, + [OpcodesBCH.OP_PUSHBYTES_51]: push, + [OpcodesBCH.OP_PUSHBYTES_52]: push, + [OpcodesBCH.OP_PUSHBYTES_53]: push, + [OpcodesBCH.OP_PUSHBYTES_54]: push, + [OpcodesBCH.OP_PUSHBYTES_55]: push, + [OpcodesBCH.OP_PUSHBYTES_56]: push, + [OpcodesBCH.OP_PUSHBYTES_57]: push, + [OpcodesBCH.OP_PUSHBYTES_58]: push, + [OpcodesBCH.OP_PUSHBYTES_59]: push, + [OpcodesBCH.OP_PUSHBYTES_60]: push, + [OpcodesBCH.OP_PUSHBYTES_61]: push, + [OpcodesBCH.OP_PUSHBYTES_62]: push, + [OpcodesBCH.OP_PUSHBYTES_63]: push, + [OpcodesBCH.OP_PUSHBYTES_64]: push, + [OpcodesBCH.OP_PUSHBYTES_65]: push, + [OpcodesBCH.OP_PUSHBYTES_66]: push, + [OpcodesBCH.OP_PUSHBYTES_67]: push, + [OpcodesBCH.OP_PUSHBYTES_68]: push, + [OpcodesBCH.OP_PUSHBYTES_69]: push, + [OpcodesBCH.OP_PUSHBYTES_70]: push, + [OpcodesBCH.OP_PUSHBYTES_71]: push, + [OpcodesBCH.OP_PUSHBYTES_72]: push, + [OpcodesBCH.OP_PUSHBYTES_73]: push, + [OpcodesBCH.OP_PUSHBYTES_74]: push, + [OpcodesBCH.OP_PUSHBYTES_75]: push, + [OpcodesBCH.OP_PUSHDATA_1]: push, + [OpcodesBCH.OP_PUSHDATA_2]: push, + [OpcodesBCH.OP_PUSHDATA_4]: push, + [OpcodesBCH.OP_1NEGATE]: conditionallyEvaluate(pushNumberOperation(-1)), + [OpcodesBCH.OP_RESERVED]: conditionallyEvaluate(reservedOperation), + [OpcodesBCH.OP_1]: conditionallyEvaluate(pushNumberOperation(1)), + /* eslint-disable @typescript-eslint/no-magic-numbers */ + [OpcodesBCH.OP_2]: conditionallyEvaluate(pushNumberOperation(2)), + [OpcodesBCH.OP_3]: conditionallyEvaluate(pushNumberOperation(3)), + [OpcodesBCH.OP_4]: conditionallyEvaluate(pushNumberOperation(4)), + [OpcodesBCH.OP_5]: conditionallyEvaluate(pushNumberOperation(5)), + [OpcodesBCH.OP_6]: conditionallyEvaluate(pushNumberOperation(6)), + [OpcodesBCH.OP_7]: conditionallyEvaluate(pushNumberOperation(7)), + [OpcodesBCH.OP_8]: conditionallyEvaluate(pushNumberOperation(8)), + [OpcodesBCH.OP_9]: conditionallyEvaluate(pushNumberOperation(9)), + [OpcodesBCH.OP_10]: conditionallyEvaluate(pushNumberOperation(10)), + [OpcodesBCH.OP_11]: conditionallyEvaluate(pushNumberOperation(11)), + [OpcodesBCH.OP_12]: conditionallyEvaluate(pushNumberOperation(12)), + [OpcodesBCH.OP_13]: conditionallyEvaluate(pushNumberOperation(13)), + [OpcodesBCH.OP_14]: conditionallyEvaluate(pushNumberOperation(14)), + [OpcodesBCH.OP_15]: conditionallyEvaluate(pushNumberOperation(15)), + [OpcodesBCH.OP_16]: conditionallyEvaluate(pushNumberOperation(16)), + /* eslint-enable @typescript-eslint/no-magic-numbers */ + ...mapOverOperations( + [incrementOperationCount], + { + [OpcodesBCH.OP_NOP]: conditionallyEvaluate(opNop), + [OpcodesBCH.OP_VER]: conditionallyEvaluate(reservedOperation), + [OpcodesBCH.OP_IF]: opIf, + [OpcodesBCH.OP_NOTIF]: opNotIf, + [OpcodesBCH.OP_VERIF]: reservedOperation, + [OpcodesBCH.OP_VERNOTIF]: reservedOperation, + [OpcodesBCH.OP_ELSE]: opElse, + [OpcodesBCH.OP_ENDIF]: opEndIf, + [OpcodesBCH.OP_VERIFY]: conditionallyEvaluate(opVerify), + [OpcodesBCH.OP_RETURN]: conditionallyEvaluate(opReturn), + [OpcodesBCH.OP_TOALTSTACK]: conditionallyEvaluate(opToAltStack), + [OpcodesBCH.OP_FROMALTSTACK]: conditionallyEvaluate(opFromAltStack), + [OpcodesBCH.OP_2DROP]: conditionallyEvaluate(op2Drop), + [OpcodesBCH.OP_2DUP]: conditionallyEvaluate(op2Dup), + [OpcodesBCH.OP_3DUP]: conditionallyEvaluate(op3Dup), + [OpcodesBCH.OP_2OVER]: conditionallyEvaluate(op2Over), + [OpcodesBCH.OP_2ROT]: conditionallyEvaluate(op2Rot), + [OpcodesBCH.OP_2SWAP]: conditionallyEvaluate(op2Swap), + [OpcodesBCH.OP_IFDUP]: conditionallyEvaluate(opIfDup), + [OpcodesBCH.OP_DEPTH]: conditionallyEvaluate(opDepth), + [OpcodesBCH.OP_DROP]: conditionallyEvaluate(opDrop), + [OpcodesBCH.OP_DUP]: conditionallyEvaluate(opDup), + [OpcodesBCH.OP_NIP]: conditionallyEvaluate(opNip), + [OpcodesBCH.OP_OVER]: conditionallyEvaluate(opOver), + [OpcodesBCH.OP_PICK]: conditionallyEvaluate(opPick), + [OpcodesBCH.OP_ROLL]: conditionallyEvaluate(opRoll), + [OpcodesBCH.OP_ROT]: conditionallyEvaluate(opRot), + [OpcodesBCH.OP_SWAP]: conditionallyEvaluate(opSwap), + [OpcodesBCH.OP_TUCK]: conditionallyEvaluate(opTuck), + [OpcodesBCH.OP_CAT]: conditionallyEvaluate(opCat), + [OpcodesBCH.OP_SPLIT]: conditionallyEvaluate(opSplit), + [OpcodesBCH.OP_NUM2BIN]: conditionallyEvaluate(opNum2Bin), + [OpcodesBCH.OP_BIN2NUM]: conditionallyEvaluate(opBin2Num), + [OpcodesBCH.OP_SIZE]: conditionallyEvaluate(opSize), + [OpcodesBCH.OP_INVERT]: disabledOperation, + [OpcodesBCH.OP_AND]: conditionallyEvaluate(opAnd), + [OpcodesBCH.OP_OR]: conditionallyEvaluate(opOr), + [OpcodesBCH.OP_XOR]: conditionallyEvaluate(opXor), + [OpcodesBCH.OP_EQUAL]: conditionallyEvaluate(opEqual), + [OpcodesBCH.OP_EQUALVERIFY]: conditionallyEvaluate(opEqualVerify), + [OpcodesBCH.OP_RESERVED1]: conditionallyEvaluate(reservedOperation), + [OpcodesBCH.OP_RESERVED2]: conditionallyEvaluate(reservedOperation), + [OpcodesBCH.OP_1ADD]: conditionallyEvaluate(op1Add), + [OpcodesBCH.OP_1SUB]: conditionallyEvaluate(op1Sub), + [OpcodesBCH.OP_2MUL]: disabledOperation, + [OpcodesBCH.OP_2DIV]: disabledOperation, + [OpcodesBCH.OP_NEGATE]: conditionallyEvaluate(opNegate), + [OpcodesBCH.OP_ABS]: conditionallyEvaluate(opAbs), + [OpcodesBCH.OP_NOT]: conditionallyEvaluate(opNot), + [OpcodesBCH.OP_0NOTEQUAL]: conditionallyEvaluate(op0NotEqual), + [OpcodesBCH.OP_ADD]: conditionallyEvaluate(opAdd), + [OpcodesBCH.OP_SUB]: conditionallyEvaluate(opSub), + [OpcodesBCH.OP_MUL]: conditionallyEvaluate(opMul), + [OpcodesBCH.OP_DIV]: conditionallyEvaluate(opDiv), + [OpcodesBCH.OP_MOD]: conditionallyEvaluate(opMod), + [OpcodesBCH.OP_LSHIFT]: disabledOperation, + [OpcodesBCH.OP_RSHIFT]: disabledOperation, + ...mapOverOperations( + [conditionallyEvaluate], + { + [OpcodesBCH.OP_BOOLAND]: opBoolAnd, + [OpcodesBCH.OP_BOOLOR]: opBoolOr, + [OpcodesBCH.OP_NUMEQUAL]: opNumEqual, + [OpcodesBCH.OP_NUMEQUALVERIFY]: opNumEqualVerify, + [OpcodesBCH.OP_NUMNOTEQUAL]: opNumNotEqual, + [OpcodesBCH.OP_LESSTHAN]: opLessThan, + [OpcodesBCH.OP_GREATERTHAN]: opGreaterThan, + [OpcodesBCH.OP_LESSTHANOREQUAL]: opLessThanOrEqual, + [OpcodesBCH.OP_GREATERTHANOREQUAL]: opGreaterThanOrEqual, + [OpcodesBCH.OP_MIN]: opMin, + [OpcodesBCH.OP_MAX]: opMax, + [OpcodesBCH.OP_WITHIN]: opWithin, + [OpcodesBCH.OP_RIPEMD160]: opRipemd160({ ripemd160 }), + [OpcodesBCH.OP_SHA1]: opSha1({ sha1 }), + [OpcodesBCH.OP_SHA256]: opSha256({ sha256 }), + [OpcodesBCH.OP_HASH160]: opHash160({ ripemd160, sha256 }), + [OpcodesBCH.OP_HASH256]: opHash256({ sha256 }), + [OpcodesBCH.OP_CODESEPARATOR]: opCodeSeparator, + [OpcodesBCH.OP_CHECKSIG]: opCheckSig({ secp256k1, sha256 }), + [OpcodesBCH.OP_CHECKSIGVERIFY]: opCheckSigVerify({ + secp256k1, + sha256, + }), + [OpcodesBCH.OP_CHECKMULTISIG]: opCheckMultiSig({ + secp256k1, + sha256, + }), + [OpcodesBCH.OP_CHECKMULTISIGVERIFY]: opCheckMultiSigVerify({ + secp256k1, + sha256, + }), + ...(standard + ? { + [OpcodesBCH.OP_NOP1]: opNopDisallowed, + [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: opCheckLockTimeVerify, + [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: opCheckSequenceVerify, + [OpcodesBCH.OP_NOP4]: opNopDisallowed, + [OpcodesBCH.OP_NOP5]: opNopDisallowed, + [OpcodesBCH.OP_NOP6]: opNopDisallowed, + [OpcodesBCH.OP_NOP7]: opNopDisallowed, + [OpcodesBCH.OP_NOP8]: opNopDisallowed, + [OpcodesBCH.OP_NOP9]: opNopDisallowed, + [OpcodesBCH.OP_NOP10]: opNopDisallowed, + } + : { + [OpcodesBCH.OP_NOP1]: opNop, + [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: opCheckLockTimeVerify, + [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: opCheckSequenceVerify, + [OpcodesBCH.OP_NOP4]: opNop, + [OpcodesBCH.OP_NOP5]: opNop, + [OpcodesBCH.OP_NOP6]: opNop, + [OpcodesBCH.OP_NOP7]: opNop, + [OpcodesBCH.OP_NOP8]: opNop, + [OpcodesBCH.OP_NOP9]: opNop, + [OpcodesBCH.OP_NOP10]: opNop, + }), + [OpcodesBCH.OP_CHECKDATASIG]: opCheckDataSig({ + secp256k1, + sha256, + }), + [OpcodesBCH.OP_CHECKDATASIGVERIFY]: opCheckDataSigVerify({ + secp256k1, + sha256, + }), + [OpcodesBCH.OP_REVERSEBYTES]: opReverseBytes, + [OpcodesBCH.OP_INPUTINDEX]: opInputIndex, + [OpcodesBCH.OP_ACTIVEBYTECODE]: opActiveBytecode, + [OpcodesBCH.OP_TXVERSION]: opTxVersion, + [OpcodesBCH.OP_TXINPUTCOUNT]: opTxInputCount, + [OpcodesBCH.OP_TXOUTPUTCOUNT]: opTxOutputCount, + [OpcodesBCH.OP_TXLOCKTIME]: opTxLocktime, + [OpcodesBCH.OP_UTXOVALUE]: opUtxoValue, + [OpcodesBCH.OP_UTXOBYTECODE]: opUtxoBytecode, + [OpcodesBCH.OP_OUTPOINTTXHASH]: opOutpointTxHash, + [OpcodesBCH.OP_OUTPOINTINDEX]: opOutpointIndex, + [OpcodesBCH.OP_INPUTBYTECODE]: opInputBytecode, + [OpcodesBCH.OP_INPUTSEQUENCENUMBER]: opInputSequenceNumber, + [OpcodesBCH.OP_OUTPUTVALUE]: opOutputValue, + [OpcodesBCH.OP_OUTPUTBYTECODE]: opOutputBytecode, + } + ), + } + ), + }, + success: (state: AuthenticationProgramStateBCH) => { + if (state.error !== undefined) { + return state.error; + } + if (state.controlStack.length !== 0) { + return AuthenticationErrorCommon.nonEmptyControlStack; + } + if (state.stack.length !== 1) { + return AuthenticationErrorCommon.requiresCleanStack; + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (!stackItemIsTruthy(state.stack[0]!)) { + return AuthenticationErrorCommon.unsuccessfulEvaluation; + } + return true; + }, + undefined: undefinedOperation, + // eslint-disable-next-line complexity + verify: ({ sourceOutputs, transaction }, evaluate, stateSuccess) => { + if (transaction.inputs.length === 0) { + return 'Transactions must have at least one input.'; + } + if (transaction.outputs.length === 0) { + return 'Transactions must have at least one output.'; + } + if (transaction.inputs.length !== sourceOutputs.length) { + return 'Unable to verify transaction: a single spent output must be provided for each transaction input.'; + } + + const transactionSize = encodeTransactionBCH(transaction).length; + if (transactionSize < ConsensusBCH.minimumTransactionSize) { + return `Transaction does not meet minimum size: the transaction is ${transactionSize} bytes, but the minimum transaction size is ${ConsensusBCH.minimumTransactionSize} bytes.`; + } + if (transactionSize > ConsensusBCH.maximumTransactionSize) { + return `Transaction exceeds maximum size: the transaction is ${transactionSize} bytes, but the maximum transaction size is ${ConsensusBCH.maximumTransactionSize} bytes.`; + } + + if (standard) { + if ( + transaction.version < 1 || + transaction.version > ConsensusBCH.maximumStandardVersion + ) { + return `Standard transactions must have a version no less than 1 and no greater than ${ConsensusBCH.maximumStandardVersion}.`; + } + if (transactionSize > ConsensusBCH.maximumStandardTransactionSize) { + return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH.maximumStandardTransactionSize} bytes.`; + } + + // eslint-disable-next-line functional/no-loop-statement + for (const [index, output] of sourceOutputs.entries()) { + if (!isStandardOutputBytecode(output.lockingBytecode)) { + return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; + } + } + + // eslint-disable-next-line functional/no-let + let totalArbitraryDataBytes = 0; + // eslint-disable-next-line functional/no-loop-statement + for (const [index, output] of transaction.outputs.entries()) { + if (!isStandardOutputBytecode(output.lockingBytecode)) { + return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; + } + + // eslint-disable-next-line functional/no-conditional-statement + if (isArbitraryDataOutput(output.lockingBytecode)) { + // eslint-disable-next-line functional/no-expression-statement + totalArbitraryDataBytes += output.lockingBytecode.length + 1; + } + /* + * TODO: disallow dust outputs + * if(IsDustOutput(output)) { + * return ``; + * } + */ + } + if (totalArbitraryDataBytes > ConsensusBCH.maximumDataCarrierBytes) { + return `Standard transactions may carry no more than ${ConsensusBCH.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; + } + + // eslint-disable-next-line functional/no-loop-statement + for (const [index, input] of transaction.inputs.entries()) { + if ( + input.unlockingBytecode.length > + ConsensusBCH.maximumStandardUnlockingBytecodeLength + ) { + return `Input index ${index} is non-standard: the unlocking bytecode (${input.unlockingBytecode.length} bytes) exceeds the maximum standard unlocking bytecode length (${ConsensusBCH.maximumStandardUnlockingBytecodeLength} bytes).`; + } + if (!isPushOnly(input.unlockingBytecode)) { + return `Input index ${index} is non-standard: unlocking bytecode may contain only push operations.`; + } + } + } + + // eslint-disable-next-line functional/no-loop-statement + for (const index of transaction.inputs.keys()) { + const state = evaluate({ + inputIndex: index, + sourceOutputs, + transaction, + }); + const result = stateSuccess(state); + if (typeof result === 'string') { + return `Error in evaluating input index ${index}: ${result}`; + } + } + + return true; + }, + }; +}; + +export const createInstructionSetBCH = createInstructionSetBCH2022; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-opcodes.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-opcodes.ts new file mode 100644 index 00000000..4c701643 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-opcodes.ts @@ -0,0 +1,291 @@ +/** + * The `BCH_2022_05` instruction set. + */ + +export enum OpcodesBCH2022 { + /** + * A.K.A. `OP_FALSE` or `OP_PUSHBYTES_0` + */ + OP_0 = 0x00, + OP_PUSHBYTES_1 = 0x01, + OP_PUSHBYTES_2 = 0x02, + OP_PUSHBYTES_3 = 0x03, + OP_PUSHBYTES_4 = 0x04, + OP_PUSHBYTES_5 = 0x05, + OP_PUSHBYTES_6 = 0x06, + OP_PUSHBYTES_7 = 0x07, + OP_PUSHBYTES_8 = 0x08, + OP_PUSHBYTES_9 = 0x09, + OP_PUSHBYTES_10 = 0x0a, + OP_PUSHBYTES_11 = 0x0b, + OP_PUSHBYTES_12 = 0x0c, + OP_PUSHBYTES_13 = 0x0d, + OP_PUSHBYTES_14 = 0x0e, + OP_PUSHBYTES_15 = 0x0f, + OP_PUSHBYTES_16 = 0x10, + OP_PUSHBYTES_17 = 0x11, + OP_PUSHBYTES_18 = 0x12, + OP_PUSHBYTES_19 = 0x13, + OP_PUSHBYTES_20 = 0x14, + OP_PUSHBYTES_21 = 0x15, + OP_PUSHBYTES_22 = 0x16, + OP_PUSHBYTES_23 = 0x17, + OP_PUSHBYTES_24 = 0x18, + OP_PUSHBYTES_25 = 0x19, + OP_PUSHBYTES_26 = 0x1a, + OP_PUSHBYTES_27 = 0x1b, + OP_PUSHBYTES_28 = 0x1c, + OP_PUSHBYTES_29 = 0x1d, + OP_PUSHBYTES_30 = 0x1e, + OP_PUSHBYTES_31 = 0x1f, + OP_PUSHBYTES_32 = 0x20, + OP_PUSHBYTES_33 = 0x21, + OP_PUSHBYTES_34 = 0x22, + OP_PUSHBYTES_35 = 0x23, + OP_PUSHBYTES_36 = 0x24, + OP_PUSHBYTES_37 = 0x25, + OP_PUSHBYTES_38 = 0x26, + OP_PUSHBYTES_39 = 0x27, + OP_PUSHBYTES_40 = 0x28, + OP_PUSHBYTES_41 = 0x29, + OP_PUSHBYTES_42 = 0x2a, + OP_PUSHBYTES_43 = 0x2b, + OP_PUSHBYTES_44 = 0x2c, + OP_PUSHBYTES_45 = 0x2d, + OP_PUSHBYTES_46 = 0x2e, + OP_PUSHBYTES_47 = 0x2f, + OP_PUSHBYTES_48 = 0x30, + OP_PUSHBYTES_49 = 0x31, + OP_PUSHBYTES_50 = 0x32, + OP_PUSHBYTES_51 = 0x33, + OP_PUSHBYTES_52 = 0x34, + OP_PUSHBYTES_53 = 0x35, + OP_PUSHBYTES_54 = 0x36, + OP_PUSHBYTES_55 = 0x37, + OP_PUSHBYTES_56 = 0x38, + OP_PUSHBYTES_57 = 0x39, + OP_PUSHBYTES_58 = 0x3a, + OP_PUSHBYTES_59 = 0x3b, + OP_PUSHBYTES_60 = 0x3c, + OP_PUSHBYTES_61 = 0x3d, + OP_PUSHBYTES_62 = 0x3e, + OP_PUSHBYTES_63 = 0x3f, + OP_PUSHBYTES_64 = 0x40, + OP_PUSHBYTES_65 = 0x41, + OP_PUSHBYTES_66 = 0x42, + OP_PUSHBYTES_67 = 0x43, + OP_PUSHBYTES_68 = 0x44, + OP_PUSHBYTES_69 = 0x45, + OP_PUSHBYTES_70 = 0x46, + OP_PUSHBYTES_71 = 0x47, + OP_PUSHBYTES_72 = 0x48, + OP_PUSHBYTES_73 = 0x49, + OP_PUSHBYTES_74 = 0x4a, + OP_PUSHBYTES_75 = 0x4b, + OP_PUSHDATA_1 = 0x4c, + OP_PUSHDATA_2 = 0x4d, + OP_PUSHDATA_4 = 0x4e, + OP_1NEGATE = 0x4f, + OP_RESERVED = 0x50, + /** + * A.K.A. `OP_TRUE` + */ + OP_1 = 0x51, + OP_2 = 0x52, + OP_3 = 0x53, + OP_4 = 0x54, + OP_5 = 0x55, + OP_6 = 0x56, + OP_7 = 0x57, + OP_8 = 0x58, + OP_9 = 0x59, + OP_10 = 0x5a, + OP_11 = 0x5b, + OP_12 = 0x5c, + OP_13 = 0x5d, + OP_14 = 0x5e, + OP_15 = 0x5f, + OP_16 = 0x60, + OP_NOP = 0x61, + OP_VER = 0x62, + OP_IF = 0x63, + OP_NOTIF = 0x64, + OP_VERIF = 0x65, + OP_VERNOTIF = 0x66, + OP_ELSE = 0x67, + OP_ENDIF = 0x68, + OP_VERIFY = 0x69, + OP_RETURN = 0x6a, + OP_TOALTSTACK = 0x6b, + OP_FROMALTSTACK = 0x6c, + OP_2DROP = 0x6d, + OP_2DUP = 0x6e, + OP_3DUP = 0x6f, + OP_2OVER = 0x70, + OP_2ROT = 0x71, + OP_2SWAP = 0x72, + OP_IFDUP = 0x73, + OP_DEPTH = 0x74, + OP_DROP = 0x75, + OP_DUP = 0x76, + OP_NIP = 0x77, + OP_OVER = 0x78, + OP_PICK = 0x79, + OP_ROLL = 0x7a, + OP_ROT = 0x7b, + OP_SWAP = 0x7c, + OP_TUCK = 0x7d, + OP_CAT = 0x7e, + OP_SPLIT = 0x7f, + OP_NUM2BIN = 0x80, + OP_BIN2NUM = 0x81, + OP_SIZE = 0x82, + OP_INVERT = 0x83, + OP_AND = 0x84, + OP_OR = 0x85, + OP_XOR = 0x86, + OP_EQUAL = 0x87, + OP_EQUALVERIFY = 0x88, + OP_RESERVED1 = 0x89, + OP_RESERVED2 = 0x8a, + OP_1ADD = 0x8b, + OP_1SUB = 0x8c, + OP_2MUL = 0x8d, + OP_2DIV = 0x8e, + OP_NEGATE = 0x8f, + OP_ABS = 0x90, + OP_NOT = 0x91, + OP_0NOTEQUAL = 0x92, + OP_ADD = 0x93, + OP_SUB = 0x94, + OP_MUL = 0x95, + OP_DIV = 0x96, + OP_MOD = 0x97, + OP_LSHIFT = 0x98, + OP_RSHIFT = 0x99, + OP_BOOLAND = 0x9a, + OP_BOOLOR = 0x9b, + OP_NUMEQUAL = 0x9c, + OP_NUMEQUALVERIFY = 0x9d, + OP_NUMNOTEQUAL = 0x9e, + OP_LESSTHAN = 0x9f, + OP_GREATERTHAN = 0xa0, + OP_LESSTHANOREQUAL = 0xa1, + OP_GREATERTHANOREQUAL = 0xa2, + OP_MIN = 0xa3, + OP_MAX = 0xa4, + OP_WITHIN = 0xa5, + OP_RIPEMD160 = 0xa6, + OP_SHA1 = 0xa7, + OP_SHA256 = 0xa8, + OP_HASH160 = 0xa9, + OP_HASH256 = 0xaa, + OP_CODESEPARATOR = 0xab, + OP_CHECKSIG = 0xac, + OP_CHECKSIGVERIFY = 0xad, + OP_CHECKMULTISIG = 0xae, + OP_CHECKMULTISIGVERIFY = 0xaf, + OP_NOP1 = 0xb0, + OP_CHECKLOCKTIMEVERIFY = 0xb1, + OP_CHECKSEQUENCEVERIFY = 0xb2, + OP_NOP4 = 0xb3, + OP_NOP5 = 0xb4, + OP_NOP6 = 0xb5, + OP_NOP7 = 0xb6, + OP_NOP8 = 0xb7, + OP_NOP9 = 0xb8, + OP_NOP10 = 0xb9, + OP_CHECKDATASIG = 0xba, + OP_CHECKDATASIGVERIFY = 0xbb, + OP_REVERSEBYTES = 0xbc, + /** + * First codepoint left undefined before nullary introspection operations. + */ + OP_UNKNOWN189 = 0xbd, + OP_UNKNOWN190 = 0xbe, + /** + * Last codepoint left undefined before nullary introspection operations. + */ + OP_UNKNOWN191 = 0xbf, + OP_INPUTINDEX = 0xc0, + OP_ACTIVEBYTECODE = 0xc1, + OP_TXVERSION = 0xc2, + OP_TXINPUTCOUNT = 0xc3, + OP_TXOUTPUTCOUNT = 0xc4, + OP_TXLOCKTIME = 0xc5, + OP_UTXOVALUE = 0xc6, + OP_UTXOBYTECODE = 0xc7, + OP_OUTPOINTTXHASH = 0xc8, + OP_OUTPOINTINDEX = 0xc9, + OP_INPUTBYTECODE = 0xca, + OP_INPUTSEQUENCENUMBER = 0xcb, + OP_OUTPUTVALUE = 0xcc, + OP_OUTPUTBYTECODE = 0xcd, + /** + * Reserved for unary introspection operations. + */ + OP_RESERVED3 = 0xce, + /** + * Reserved for unary introspection operations. + */ + OP_RESERVED4 = 0xcf, + OP_UNKNOWN208 = 0xd0, + OP_UNKNOWN209 = 0xd1, + OP_UNKNOWN210 = 0xd2, + OP_UNKNOWN211 = 0xd3, + OP_UNKNOWN212 = 0xd4, + OP_UNKNOWN213 = 0xd5, + OP_UNKNOWN214 = 0xd6, + OP_UNKNOWN215 = 0xd7, + OP_UNKNOWN216 = 0xd8, + OP_UNKNOWN217 = 0xd9, + OP_UNKNOWN218 = 0xda, + OP_UNKNOWN219 = 0xdb, + OP_UNKNOWN220 = 0xdc, + OP_UNKNOWN221 = 0xdd, + OP_UNKNOWN222 = 0xde, + OP_UNKNOWN223 = 0xdf, + OP_UNKNOWN224 = 0xe0, + OP_UNKNOWN225 = 0xe1, + OP_UNKNOWN226 = 0xe2, + OP_UNKNOWN227 = 0xe3, + OP_UNKNOWN228 = 0xe4, + OP_UNKNOWN229 = 0xe5, + OP_UNKNOWN230 = 0xe6, + OP_UNKNOWN231 = 0xe7, + OP_UNKNOWN232 = 0xe8, + OP_UNKNOWN233 = 0xe9, + OP_UNKNOWN234 = 0xea, + OP_UNKNOWN235 = 0xeb, + OP_UNKNOWN236 = 0xec, + OP_UNKNOWN237 = 0xed, + OP_UNKNOWN238 = 0xee, + OP_UNKNOWN239 = 0xef, + /** + * A.K.A. `OP_PREFIX_BEGIN` + */ + OP_UNKNOWN240 = 0xf0, + OP_UNKNOWN241 = 0xf1, + OP_UNKNOWN242 = 0xf2, + OP_UNKNOWN243 = 0xf3, + OP_UNKNOWN244 = 0xf4, + OP_UNKNOWN245 = 0xf5, + OP_UNKNOWN246 = 0xf6, + /** + * A.K.A. `OP_PREFIX_END` + */ + OP_UNKNOWN247 = 0xf7, + OP_UNKNOWN248 = 0xf8, + OP_UNKNOWN249 = 0xf9, + OP_UNKNOWN250 = 0xfa, + OP_UNKNOWN251 = 0xfb, + OP_UNKNOWN252 = 0xfc, + OP_UNKNOWN253 = 0xfd, + OP_UNKNOWN254 = 0xfe, + OP_UNKNOWN255 = 0xff, +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const OpcodesBCH = OpcodesBCH2022; +// eslint-disable-next-line @typescript-eslint/naming-convention +export const Opcodes = OpcodesBCH; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts new file mode 100644 index 00000000..3639fc3d --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts @@ -0,0 +1,84 @@ +import { hexToBin } from '../../../../format/format.js'; +import type { + AuthenticationProgramCommon, + AuthenticationProgramStateCommon, + AuthenticationVirtualMachine, + CompilationContext, + Input, + Output, + ResolvedTransactionCommon, + TransactionCommon, +} from '../../../../lib'; +import { + encodeTransactionCommon, + hashTransactionP2pOrder, +} from '../../../../message/message.js'; + +export type ResolvedTransactionBCH = ResolvedTransactionCommon; +export type ResolvedTransaction = ResolvedTransactionBCH; +export type AuthenticationProgramBCH = AuthenticationProgramCommon; +export type AuthenticationProgram = AuthenticationProgramBCH; +export type AuthenticationProgramStateBCH = AuthenticationProgramStateCommon; +export type AuthenticationProgramState = AuthenticationProgramStateBCH; +export type TransactionBCH< + InputType = Input, + OutputType = Output +> = TransactionCommon; +export type Transaction< + InputType = Input, + OutputType = Output +> = TransactionBCH; + +export type CompilationContextBCH = CompilationContext< + TransactionBCH> +>; + +export type AuthenticationVirtualMachineBCH = AuthenticationVirtualMachine< + ResolvedTransactionBCH, + AuthenticationProgramBCH, + AuthenticationProgramStateBCH +>; + +// TODO: replace with scenarios +export const createTestAuthenticationProgramBCH = ({ + lockingBytecode, + valueSatoshis, + unlockingBytecode, +}: Output & Pick) => { + const testFundingTransaction: TransactionBCH = { + inputs: [ + { + outpointIndex: 0xffffffff, + outpointTransactionHash: hexToBin( + '0000000000000000000000000000000000000000000000000000000000000000' + ), + sequenceNumber: 0xffffffff, + unlockingBytecode: Uint8Array.of(0, 0), + }, + ], + locktime: 0, + outputs: [{ lockingBytecode, valueSatoshis }], + version: 1, + }; + const testSpendingTransaction: TransactionBCH = { + inputs: [ + { + outpointIndex: 0, + outpointTransactionHash: hashTransactionP2pOrder( + encodeTransactionCommon(testFundingTransaction) + ), + + sequenceNumber: 0xffffffff, + unlockingBytecode, + }, + ], + locktime: 0, + outputs: [{ lockingBytecode: Uint8Array.of(), valueSatoshis }], + version: 1, + }; + return { + inputIndex: 0, + sourceOutputs: testFundingTransaction.outputs, + transaction: testSpendingTransaction, + }; +}; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-vm.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-vm.ts new file mode 100644 index 00000000..2a25ab76 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-vm.ts @@ -0,0 +1,16 @@ +import { createAuthenticationVirtualMachine } from '../../../virtual-machine.js'; + +import { createInstructionSetBCH2022 } from './bch-2022-instruction-set.js'; + +/** + * Initialize a virtual machine using the BCH instruction set. + * + * @param standard - If `true`, the additional `isStandard` validations will be + * enabled. Transactions that fail these rules are often called "non-standard" + * and can technically be included by miners in valid blocks, but most network + * nodes will refuse to relay them. (Default: `true`) + */ +export const createVirtualMachineBCH2022 = (standard = true) => + createAuthenticationVirtualMachine(createInstructionSetBCH2022(standard)); + +export const createVirtualMachineBCH = createVirtualMachineBCH2022; diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022.ts new file mode 100644 index 00000000..115421a2 --- /dev/null +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022.ts @@ -0,0 +1,6 @@ +export * from './bch-2022-descriptions.js'; +export * from './bch-2022-errors.js'; +export * from './bch-2022-instruction-set.js'; +export * from './bch-2022-opcodes.js'; +export * from './bch-2022-types.js'; +export * from './bch-2022-vm.js'; diff --git a/src/lib/vm/instruction-sets/bch/bch-descriptions.ts b/src/lib/vm/instruction-sets/bch/bch-descriptions.ts deleted file mode 100644 index 8410065a..00000000 --- a/src/lib/vm/instruction-sets/bch/bch-descriptions.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { OpcodeDescriptionsCommon } from '../common/descriptions'; - -export enum OpcodeDescriptionsUniqueBCH { - OP_CAT = 'Pop the top 2 items from the stack and concatenate them, pushing the result.', - OP_SPLIT = 'Pop the top item from the stack as an index (Script Number) and the next item as a byte array. Split the byte array into two stack items at the index (zero-based), pushing the results.', - OP_NUM2BIN = 'Pop the top item from the stack as an item length (Script Number) and the next item as a Script Number (without encoding restrictions). Re-encode the number using a byte array of the provided length, filling any unused bytes with zeros. (If the requested length is too short to encode the number, error.)', - OP_BIN2NUM = "Pop the top item from the stack as a Script Number without encoding restrictions. Minimally-encode the number and push the result. (If the number can't be encoded in 4 bytes or less, error.)", - OP_AND = 'Pop the top 2 items from the stack and perform a bitwise AND on each byte, pushing the result. If the length of the items are not equal, error.', - OP_OR = 'Pop the top 2 items from the stack and perform a bitwise OR on each byte, pushing the result. If the length of the items are not equal, error.', - OP_XOR = 'Pop the top 2 items from the stack and perform a bitwise XOR on each byte, pushing the result. If the length of the items are not equal, error.', - OP_DIV = 'Pop the top item from the stack as a denominator (Script Number) and the next as a numerator (Script Number). Divide and push the result to the stack.', - OP_MOD = 'Pop the top item from the stack as a denominator (Script Number) and the next as a numerator (Script Number). Divide and push the remainder to the stack.', - OP_CHECKDATASIG = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is valid, push a Script Number 1, otherwise push a Script Number 0.', - OP_CHECKDATASIGVERIFY = 'Pop the top 3 items from the stack. Treat the top as a public key, the second as a message, and the third as a signature. If the signature is not valid, error. (This operation is a combination of OP_CHECKDATASIG followed by OP_VERIFY.)', - OP_REVERSEBYTES = 'Pop the top item from the stack and reverse it, pushing the result.', -} - -/** - * A map of descriptions for each Bitcoin Cash opcode. - */ -// eslint-disable-next-line @typescript-eslint/naming-convention -export const OpcodeDescriptionsBCH = { - ...OpcodeDescriptionsCommon, - ...OpcodeDescriptionsUniqueBCH, -}; diff --git a/src/lib/vm/instruction-sets/bch/bch-errors.ts b/src/lib/vm/instruction-sets/bch/bch-errors.ts deleted file mode 100644 index 9f881f93..00000000 --- a/src/lib/vm/instruction-sets/bch/bch-errors.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum AuthenticationErrorBCH { - exceededMaximumOperationCount = 'Program exceeded the maximum operation count (201 operations).', - exceededMaximumStackItemLength = 'Program attempted to push a stack item which exceeded the maximum stack item length (520 bytes).', - exceededMaximumScriptNumberLength = 'Program attempted an OP_BIN2NUM operation on a byte sequence which cannot be encoded within the maximum Script Number length (4 bytes).', - divisionByZero = 'Program attempted to divide a number by zero.', - insufficientLength = 'Program called an OP_NUM2BIN operation with an insufficient byte length to re-encode the provided number.', - invalidSplitIndex = 'Program called an OP_SPLIT operation with an invalid index.', - malformedP2shBytecode = 'Redeem bytecode was malformed prior to P2SH evaluation.', - mismatchedBitwiseOperandLength = 'Program attempted a bitwise operation on operands of different lengths.', - requiresPushOnly = 'Unlocking bytecode may contain only push operations.', -} diff --git a/src/lib/vm/instruction-sets/bch/bch-instruction-sets.ts b/src/lib/vm/instruction-sets/bch/bch-instruction-sets.ts deleted file mode 100644 index fe11d50e..00000000 --- a/src/lib/vm/instruction-sets/bch/bch-instruction-sets.ts +++ /dev/null @@ -1,361 +0,0 @@ -import { Ripemd160, Secp256k1, Sha1, Sha256 } from '../../../crypto/crypto'; -import { InstructionSet } from '../../virtual-machine'; -import { - conditionallyEvaluate, - incrementOperationCount, - mapOverOperations, -} from '../common/combinators'; -import { - applyError, - AuthenticationErrorCommon, - checkLimitsCommon, - cloneAuthenticationProgramStateCommon, - cloneStack, - commonOperations, - ConsensusCommon, - createAuthenticationProgramStateCommon, - createTransactionContextCommon, - stackItemIsTruthy, - undefinedOperation, -} from '../common/common'; -import { AuthenticationInstruction } from '../instruction-sets-types'; -import { - authenticationInstructionsAreMalformed, - parseBytecode, -} from '../instruction-sets-utils'; - -import { AuthenticationErrorBCH } from './bch-errors'; -import { OpcodesBCH } from './bch-opcodes'; -import { bitcoinCashOperations } from './bch-operations'; -import { - AuthenticationProgramBCH, - AuthenticationProgramStateBCH, -} from './bch-types'; - -export { OpcodesBCH }; - -const enum PayToScriptHash { - length = 3, - lastElement = 2, -} - -export const isPayToScriptHash = ( - verificationInstructions: readonly AuthenticationInstruction[] -) => - verificationInstructions.length === PayToScriptHash.length && - ((verificationInstructions[0].opcode as unknown) as number) === - OpcodesBCH.OP_HASH160 && - ((verificationInstructions[1].opcode as unknown) as number) === - OpcodesBCH.OP_PUSHBYTES_20 && - ((verificationInstructions[PayToScriptHash.lastElement] - .opcode as unknown) as number) === OpcodesBCH.OP_EQUAL; - -const enum SegWit { - minimumLength = 4, - maximumLength = 42, - OP_0 = 0, - OP_1 = 81, - OP_16 = 96, - versionAndLengthBytes = 2, -} - -/** - * Test a stack item for the SegWit Recovery Rules activated in `BCH_2019_05`. - * - * @param bytecode - the stack item to test - */ -// eslint-disable-next-line complexity -export const isWitnessProgram = (bytecode: Uint8Array) => { - const correctLength = - bytecode.length >= SegWit.minimumLength && - bytecode.length <= SegWit.maximumLength; - const validVersionPush = - bytecode[0] === SegWit.OP_0 || - (bytecode[0] >= SegWit.OP_1 && bytecode[0] <= SegWit.OP_16); - const correctLengthByte = - bytecode[1] + SegWit.versionAndLengthBytes === bytecode.length; - return correctLength && validVersionPush && correctLengthByte; -}; - -/** - * From C++ implementation: - * Note that IsPushOnly() *does* consider OP_RESERVED to be a push-type - * opcode, however execution of OP_RESERVED fails, so it's not relevant to - * P2SH/BIP62 as the scriptSig would fail prior to the P2SH special - * validation code being executed. - */ -const isPushOperation = (opcode: number) => opcode < OpcodesBCH.OP_16; - -/** - * This library's supported versions of the BCH virtual machine. "Strict" - * versions (A.K.A. `isStandard` from the C++ implementations) enable additional - * validation which is commonly used on the P2P network before relaying - * transactions. Transactions which fail these rules are often called - * "non-standard" – the transactions can technically be included by miners in - * valid blocks, but most network nodes will refuse to relay them. - * - * BCH instruction sets marked `SPEC` ("specification") have not yet been - * deployed on the main network and are subject to change. After deployment, the - * `SPEC` suffix is removed. This change only effects the name of the TypeScript - * enum member – the value remains the same. E.g. - * `InstructionSetBCH.BCH_2020_05_SPEC` became `InstructionSetBCH.BCH_2020_05`, - * but the value remained `BCH_2020_05`. - * - * This allows consumers to select an upgrade policy: when a version of Libauth - * is released in which compatibility with a deployed virtual machine is - * confirmed, this change can help to identify downstream code which requires - * review. - * - Consumers which prefer to upgrade manually should specify a `SPEC` type, - * e.g. `InstructionSetBCH.BCH_2020_05_SPEC`. - * - Consumers which prefer full compatibility between Libauth version should - * specify a precise instruction set value (e.g. `BCH_2020_05`) or use the - * dedicated "current" value: `instructionSetBCHCurrentStrict`. - */ -export enum InstructionSetBCH { - BCH_2019_05 = 'BCH_2019_05', - BCH_2019_05_STRICT = 'BCH_2019_05_STRICT', - BCH_2019_11 = 'BCH_2019_11', - BCH_2019_11_STRICT = 'BCH_2019_11_STRICT', - BCH_2020_05 = 'BCH_2020_05', - BCH_2020_05_STRICT = 'BCH_2020_05_STRICT', - BCH_2020_11_SPEC = 'BCH_2020_11', - BCH_2020_11_STRICT_SPEC = 'BCH_2020_11_STRICT', - BCH_2021_05_SPEC = 'BCH_2021_05', - BCH_2021_05_STRICT_SPEC = 'BCH_2021_05_STRICT', - BCH_2021_11_SPEC = 'BCH_2021_11', - BCH_2021_11_STRICT_SPEC = 'BCH_2021_11_STRICT', - BCH_2022_05_SPEC = 'BCH_2022_05', - BCH_2022_05_STRICT_SPEC = 'BCH_2022_05_STRICT', - BCH_2022_11_SPEC = 'BCH_2022_11', - BCH_2022_11_STRICT_SPEC = 'BCH_2022_11_STRICT', -} - -/** - * The current strict virtual machine version used by the Bitcoin Cash (BCH) - * network. - */ -export const instructionSetBCHCurrentStrict = - InstructionSetBCH.BCH_2020_05_STRICT; - -// eslint-disable-next-line complexity -export const getFlagsForInstructionSetBCH = ( - instructionSet: InstructionSetBCH -) => { - switch (instructionSet) { - case InstructionSetBCH.BCH_2019_05: - return { - disallowUpgradableNops: false, - opReverseBytes: false, - requireBugValueZero: false, - requireMinimalEncoding: false, - requireNullSignatureFailures: true, - }; - case InstructionSetBCH.BCH_2019_05_STRICT: - return { - disallowUpgradableNops: true, - opReverseBytes: false, - requireBugValueZero: false, - requireMinimalEncoding: true, - requireNullSignatureFailures: true, - }; - case InstructionSetBCH.BCH_2019_11: - return { - disallowUpgradableNops: false, - opReverseBytes: false, - requireBugValueZero: true, - requireMinimalEncoding: true, - requireNullSignatureFailures: true, - }; - case InstructionSetBCH.BCH_2019_11_STRICT: - return { - disallowUpgradableNops: true, - opReverseBytes: false, - requireBugValueZero: true, - requireMinimalEncoding: true, - requireNullSignatureFailures: true, - }; - case InstructionSetBCH.BCH_2020_05: - return { - disallowUpgradableNops: false, - opReverseBytes: true, - requireBugValueZero: false, - requireMinimalEncoding: false, - requireNullSignatureFailures: true, - }; - case InstructionSetBCH.BCH_2020_05_STRICT: - return { - disallowUpgradableNops: true, - opReverseBytes: true, - requireBugValueZero: true, - requireMinimalEncoding: true, - requireNullSignatureFailures: true, - }; - default: - return new Error( - `${instructionSet as string} is not a known instruction set.` - ) as never; - } -}; - -/** - * Initialize a new instruction set for the BCH virtual machine. - * - * @param flags - an object configuring the flags for this vm (see - * `getFlagsForInstructionSetBCH`) - * @param sha1 - a Sha1 implementation - * @param sha256 - a Sha256 implementation - * @param ripemd160 - a Ripemd160 implementation - * @param secp256k1 - a Secp256k1 implementation - */ -export const createInstructionSetBCH = ({ - flags, - ripemd160, - secp256k1, - sha1, - sha256, -}: { - flags: { - readonly disallowUpgradableNops: boolean; - readonly opReverseBytes: boolean; - readonly requireBugValueZero: boolean; - readonly requireMinimalEncoding: boolean; - readonly requireNullSignatureFailures: boolean; - }; - sha1: { hash: Sha1['hash'] }; - sha256: { hash: Sha256['hash'] }; - ripemd160: { hash: Ripemd160['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; -}): InstructionSet< - AuthenticationProgramBCH, - AuthenticationProgramStateBCH -> => ({ - clone: cloneAuthenticationProgramStateCommon, - continue: (state: AuthenticationProgramStateBCH) => - state.error === undefined && state.ip < state.instructions.length, - // eslint-disable-next-line complexity - evaluate: (program, stateEvaluate) => { - const { unlockingBytecode } = program.spendingTransaction.inputs[ - program.inputIndex - ]; - const { lockingBytecode } = program.sourceOutput; - const unlockingInstructions = parseBytecode(unlockingBytecode); - const lockingInstructions = parseBytecode(lockingBytecode); - const externalState = createTransactionContextCommon(program); - const initialState = createAuthenticationProgramStateCommon< - OpcodesBCH, - AuthenticationErrorBCH - >({ - instructions: unlockingInstructions, - stack: [], - transactionContext: externalState, - }); - - const unlockingResult = - unlockingBytecode.length > ConsensusCommon.maximumBytecodeLength - ? applyError( - AuthenticationErrorCommon.exceededMaximumBytecodeLengthUnlocking, - initialState - ) - : authenticationInstructionsAreMalformed(unlockingInstructions) - ? applyError( - AuthenticationErrorCommon.malformedUnlockingBytecode, - initialState - ) - : lockingBytecode.length > ConsensusCommon.maximumBytecodeLength - ? applyError( - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, - initialState - ) - : authenticationInstructionsAreMalformed(lockingInstructions) - ? applyError( - AuthenticationErrorCommon.malformedLockingBytecode, - initialState - ) - : initialState.instructions.every((instruction) => - isPushOperation((instruction.opcode as unknown) as number) - ) - ? stateEvaluate(initialState) - : applyError( - AuthenticationErrorBCH.requiresPushOnly, - initialState - ); - - if (unlockingResult.error !== undefined) { - return unlockingResult; - } - const lockingResult = stateEvaluate( - createAuthenticationProgramStateCommon< - OpcodesBCH, - AuthenticationErrorBCH - >({ - instructions: lockingInstructions, - stack: unlockingResult.stack, - transactionContext: externalState, - }) - ); - if (!isPayToScriptHash(lockingInstructions)) { - return lockingResult; - } - - const p2shStack = cloneStack(unlockingResult.stack); - // eslint-disable-next-line functional/immutable-data - const p2shScript = p2shStack.pop() ?? Uint8Array.of(); - - if (p2shStack.length === 0 && isWitnessProgram(p2shScript)) { - return lockingResult; - } - - const p2shInstructions = parseBytecode(p2shScript); - return authenticationInstructionsAreMalformed(p2shInstructions) - ? { - ...lockingResult, - error: AuthenticationErrorBCH.malformedP2shBytecode, - } - : stateEvaluate( - createAuthenticationProgramStateCommon< - OpcodesBCH, - AuthenticationErrorBCH - >({ - instructions: p2shInstructions, - stack: p2shStack, - transactionContext: externalState, - }) - ); - }, - operations: { - ...commonOperations< - OpcodesBCH, - AuthenticationProgramStateBCH, - AuthenticationErrorBCH - >({ flags, ripemd160, secp256k1, sha1, sha256 }), - ...mapOverOperations( - bitcoinCashOperations({ - flags, - secp256k1, - sha256, - }), - conditionallyEvaluate, - incrementOperationCount, - checkLimitsCommon - ), - }, - ...undefinedOperation(), - verify: (state: AuthenticationProgramStateBCH) => { - if (state.error !== undefined) { - return state.error; - } - if (state.executionStack.length !== 0) { - return AuthenticationErrorCommon.nonEmptyExecutionStack; - } - if (state.stack.length !== 1) { - return AuthenticationErrorCommon.requiresCleanStack; - } - if (!stackItemIsTruthy(state.stack[0])) { - return AuthenticationErrorCommon.unsuccessfulEvaluation; - } - return true; - }, -}); diff --git a/src/lib/vm/instruction-sets/bch/bch-operations.ts b/src/lib/vm/instruction-sets/bch/bch-operations.ts deleted file mode 100644 index 354722cc..00000000 --- a/src/lib/vm/instruction-sets/bch/bch-operations.ts +++ /dev/null @@ -1,367 +0,0 @@ -import { Secp256k1, Sha256 } from '../../../crypto/crypto'; -import { flattenBinArray } from '../../../format/hex'; -import { - AuthenticationProgramStateCommon, - AuthenticationProgramStateError, - AuthenticationProgramStateSignatureAnalysis, - AuthenticationProgramStateStack, -} from '../../vm-types'; -import { - combineOperations, - pushToStack, - useOneScriptNumber, - useOneStackItem, - useThreeStackItems, - useTwoScriptNumbers, - useTwoStackItems, -} from '../common/combinators'; -import { ConsensusCommon } from '../common/common'; -import { - isValidPublicKeyEncoding, - isValidSignatureEncodingDER, -} from '../common/encoding'; -import { applyError, AuthenticationErrorCommon } from '../common/errors'; -import { opVerify } from '../common/flow-control'; -import { bigIntToScriptNumber, booleanToScriptNumber } from '../common/types'; - -import { AuthenticationErrorBCH } from './bch-errors'; -import { OpcodesBCH } from './bch-opcodes'; -import { ConsensusBCH } from './bch-types'; - -export const opCat = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->() => (state: State) => - useTwoStackItems(state, (nextState, [a, b]) => - a.length + b.length > ConsensusCommon.maximumStackItemLength - ? applyError( - AuthenticationErrorBCH.exceededMaximumStackItemLength, - nextState - ) - : pushToStack(nextState, flattenBinArray([a, b])) - ); - -export const opSplit = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, value) => { - const index = Number(value); - return useOneStackItem(nextState, (finalState, [item]) => - index < 0 || index > item.length - ? applyError( - AuthenticationErrorBCH.invalidSplitIndex, - finalState - ) - : pushToStack(finalState, item.slice(0, index), item.slice(index)) - ); - }, - { requireMinimalEncoding } - ); - -enum Constants { - positiveSign = 0x00, - negativeSign = 0x80, -} - -export const padMinimallyEncodedScriptNumber = ( - scriptNumber: Uint8Array, - length: number -) => { - // eslint-disable-next-line functional/no-let - let signBit = Constants.positiveSign; - // eslint-disable-next-line functional/no-conditional-statement - if (scriptNumber.length > 0) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise - signBit = scriptNumber[scriptNumber.length - 1] & Constants.negativeSign; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data - scriptNumber[scriptNumber.length - 1] &= Constants.negativeSign - 1; - } - const result = Array.from(scriptNumber); - // eslint-disable-next-line functional/no-loop-statement - while (result.length < length - 1) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - result.push(0); - } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - result.push(signBit); - return Uint8Array.from(result); -}; - -export const opNum2Bin = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->() => (state: State) => - useOneScriptNumber( - state, - (nextState, value) => { - const targetLength = Number(value); - return targetLength > ConsensusCommon.maximumStackItemLength - ? applyError( - AuthenticationErrorBCH.exceededMaximumStackItemLength, - nextState - ) - : useOneScriptNumber( - nextState, - (finalState, [target]) => { - const minimallyEncoded = bigIntToScriptNumber(target); - return minimallyEncoded.length > targetLength - ? applyError( - AuthenticationErrorBCH.insufficientLength, - finalState - ) - : minimallyEncoded.length === targetLength - ? pushToStack(finalState, minimallyEncoded) - : pushToStack( - finalState, - padMinimallyEncodedScriptNumber( - minimallyEncoded, - targetLength - ) - ); - }, - { - maximumScriptNumberByteLength: - // TODO: is this right? - ConsensusCommon.maximumStackItemLength, - requireMinimalEncoding: false, - } - ); - }, - { requireMinimalEncoding: true } - ); - -export const opBin2Num = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->() => (state: State) => - useOneScriptNumber( - state, - (nextState, [target]) => { - const minimallyEncoded = bigIntToScriptNumber(target); - return minimallyEncoded.length > ConsensusCommon.maximumScriptNumberLength - ? applyError( - AuthenticationErrorBCH.exceededMaximumScriptNumberLength, - nextState - ) - : pushToStack(nextState, minimallyEncoded); - }, - { - // TODO: is this right? - maximumScriptNumberByteLength: ConsensusCommon.maximumStackItemLength, - requireMinimalEncoding: false, - } - ); - -export const bitwiseOperation = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->( - combine: (a: Uint8Array, b: Uint8Array) => Uint8Array -) => (state: State) => - useTwoStackItems(state, (nextState, [a, b]) => - a.length === b.length - ? pushToStack(nextState, combine(a, b)) - : applyError( - AuthenticationErrorBCH.mismatchedBitwiseOperandLength, - nextState - ) - ); - -export const opAnd = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError - // eslint-disable-next-line no-bitwise ->() => bitwiseOperation((a, b) => a.map((v, i) => v & b[i])); - -export const opOr = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError - // eslint-disable-next-line no-bitwise ->() => bitwiseOperation((a, b) => a.map((v, i) => v | b[i])); - -export const opXor = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError - // eslint-disable-next-line no-bitwise ->() => bitwiseOperation((a, b) => a.map((v, i) => v ^ b[i])); - -export const opDiv = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [a, b]) => - b === BigInt(0) - ? applyError( - AuthenticationErrorBCH.divisionByZero, - nextState - ) - : pushToStack(nextState, bigIntToScriptNumber(a / b)), - { requireMinimalEncoding } - ); - -export const opMod = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [a, b]) => - b === BigInt(0) - ? applyError( - AuthenticationErrorBCH.divisionByZero, - nextState - ) - : pushToStack(nextState, bigIntToScriptNumber(a % b)), - { requireMinimalEncoding } - ); - -/** - * Validate the encoding of a raw signature – a signature without a signing - * serialization type byte (A.K.A. "sighash" byte). - * - * @param signature - the raw signature - */ -export const isValidSignatureEncodingBCHRaw = (signature: Uint8Array) => - signature.length === 0 || - signature.length === ConsensusBCH.schnorrSignatureLength || - isValidSignatureEncodingDER(signature); - -export const opCheckDataSig = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError & - AuthenticationProgramStateSignatureAnalysis, - Errors ->({ - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; -}) => (state: State) => - // eslint-disable-next-line complexity - useThreeStackItems(state, (nextState, [signature, message, publicKey]) => { - if (!isValidSignatureEncodingBCHRaw(signature)) { - return applyError( - AuthenticationErrorCommon.invalidSignatureEncoding, - nextState - ); - } - if (!isValidPublicKeyEncoding(publicKey)) { - return applyError( - AuthenticationErrorCommon.invalidPublicKeyEncoding, - nextState - ); - } - const digest = sha256.hash(message); - - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - nextState.signedMessages.push(message); - - const useSchnorr = signature.length === ConsensusBCH.schnorrSignatureLength; - const success = useSchnorr - ? secp256k1.verifySignatureSchnorr(signature, publicKey, digest) - : secp256k1.verifySignatureDERLowS(signature, publicKey, digest); - - return !success && signature.length !== 0 - ? applyError( - AuthenticationErrorCommon.nonNullSignatureFailure, - nextState - ) - : pushToStack(nextState, booleanToScriptNumber(success)); - }); - -export const opCheckDataSigVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError & - AuthenticationProgramStateSignatureAnalysis, - Errors ->({ - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; -}) => - combineOperations( - opCheckDataSig({ secp256k1, sha256 }), - opVerify() - ); - -export const opReverseBytes = < - State extends AuthenticationProgramStateStack ->() => (state: State) => - useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item.slice().reverse()) - ); - -export const bitcoinCashOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon< - Opcodes, - AuthenticationErrorBCH - > ->({ - flags, - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { - opReverseBytes: boolean; - requireBugValueZero: boolean; - requireMinimalEncoding: boolean; - requireNullSignatureFailures: boolean; - }; -}) => { - const operations = { - [OpcodesBCH.OP_CAT]: opCat(), - [OpcodesBCH.OP_SPLIT]: opSplit(flags), - [OpcodesBCH.OP_NUM2BIN]: opNum2Bin(), - [OpcodesBCH.OP_BIN2NUM]: opBin2Num(), - [OpcodesBCH.OP_AND]: opAnd(), - [OpcodesBCH.OP_OR]: opOr(), - [OpcodesBCH.OP_XOR]: opXor(), - [OpcodesBCH.OP_DIV]: opDiv(flags), - [OpcodesBCH.OP_MOD]: opMod(flags), - [OpcodesBCH.OP_CHECKDATASIG]: opCheckDataSig( - { - secp256k1, - sha256, - } - ), - [OpcodesBCH.OP_CHECKDATASIGVERIFY]: opCheckDataSigVerify< - State, - AuthenticationErrorBCH - >({ secp256k1, sha256 }), - }; - return flags.opReverseBytes - ? { ...operations, [OpcodesBCH.OP_REVERSEBYTES]: opReverseBytes() } - : operations; -}; diff --git a/src/lib/vm/instruction-sets/bch/bch-types.ts b/src/lib/vm/instruction-sets/bch/bch-types.ts deleted file mode 100644 index c0fd757a..00000000 --- a/src/lib/vm/instruction-sets/bch/bch-types.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Sha256 } from '../../../crypto/sha256'; -import { hexToBin } from '../../../format/format'; -import { - encodeTransaction, - getTransactionHashBE, -} from '../../../transaction/transaction-serialization'; -import { - Input, - Output, - Transaction, -} from '../../../transaction/transaction-types'; -import { - AuthenticationProgramCommon, - AuthenticationProgramStateCommon, -} from '../../vm-types'; - -import { AuthenticationErrorBCH } from './bch-errors'; -import { OpcodesBCH } from './bch-opcodes'; - -export enum ConsensusBCH { - schnorrSignatureLength = 64, -} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface AuthenticationProgramBCH extends AuthenticationProgramCommon {} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface AuthenticationProgramStateBCH - extends AuthenticationProgramStateCommon< - OpcodesBCH, - AuthenticationErrorBCH - > {} - -export const createTestAuthenticationProgramBCH = ({ - lockingBytecode, - satoshis, - sha256, - unlockingBytecode, -}: { - /** - * An implementation of sha256. Available via `instantiateSha256`. - */ - sha256: { hash: Sha256['hash'] }; -} & Output & - Pick) => { - const testFundingTransaction: Transaction = { - inputs: [ - { - outpointIndex: 0xffffffff, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - sequenceNumber: 0xffffffff, - unlockingBytecode: Uint8Array.of(0, 0), - }, - ], - locktime: 0, - outputs: [{ lockingBytecode, satoshis }], - version: 1, - }; - const testSpendingTransaction: Transaction = { - inputs: [ - { - outpointIndex: 0, - outpointTransactionHash: getTransactionHashBE( - sha256, - encodeTransaction(testFundingTransaction) - ), - - sequenceNumber: 0xffffffff, - unlockingBytecode, - }, - ], - locktime: 0, - outputs: [{ lockingBytecode: Uint8Array.of(), satoshis }], - version: 1, - }; - return { - inputIndex: 0, - sourceOutput: testFundingTransaction.outputs[0], - spendingTransaction: testSpendingTransaction, - }; -}; diff --git a/src/lib/vm/instruction-sets/bch/bch.spec.ts b/src/lib/vm/instruction-sets/bch/bch.spec.ts deleted file mode 100644 index c8649abf..00000000 --- a/src/lib/vm/instruction-sets/bch/bch.spec.ts +++ /dev/null @@ -1,617 +0,0 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ - -import test from 'ava'; - -import { - AuthenticationProgramStateBCH, - createAuthenticationProgramStateCommonEmpty, - createTestAuthenticationProgramBCH, - hexToBin, - instantiateSha256, - instantiateVirtualMachineBCH, - OpcodesBCH, - parseBytecode, -} from '../../../lib'; - -test('[BCH VM] vm.stateEvaluate: OP_2 OP_2 OP_ADD', async (t) => { - const vm = await instantiateVirtualMachineBCH(); - const state = createAuthenticationProgramStateCommonEmpty({ - instructions: parseBytecode( - Uint8Array.from([OpcodesBCH.OP_2, OpcodesBCH.OP_2, OpcodesBCH.OP_ADD]) - ), - }) as AuthenticationProgramStateBCH; - const result = vm.stateEvaluate(state); - t.deepEqual(result, { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }); -}); - -test('[BCH VM] vm.stateDebug: OP_2 OP_2 OP_ADD', async (t) => { - const vm = await instantiateVirtualMachineBCH(); - const state = createAuthenticationProgramStateCommonEmpty({ - instructions: parseBytecode( - Uint8Array.from([OpcodesBCH.OP_2, OpcodesBCH.OP_2, OpcodesBCH.OP_ADD]) - ), - }) as AuthenticationProgramStateBCH; - const result = vm.stateDebug(state); - t.deepEqual(result, [ - { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }, - { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }, - ]); -}); - -test('[BCH VM] vm.stateStep through: OP_2 OP_2 OP_ADD', async (t) => { - const vm = await instantiateVirtualMachineBCH(); - const state0 = createAuthenticationProgramStateCommonEmpty({ - instructions: parseBytecode( - Uint8Array.from([OpcodesBCH.OP_2, OpcodesBCH.OP_2, OpcodesBCH.OP_ADD]) - ), - }) as AuthenticationProgramStateBCH; - const state1 = vm.stateStep(state0); - const state2 = vm.stateStep(state1); - t.deepEqual(vm.stateContinue(state2), true); - const state3 = vm.stateStep(state2); - t.deepEqual(vm.stateContinue(state3), false); - - t.deepEqual(state0, { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }); - t.deepEqual(state1, { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }); - t.deepEqual(state2, { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }); - t.deepEqual(state3, { - alternateStack: [], - correspondingOutput: Uint8Array.of(0), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, - }); -}); - -test('[BCH VM] vm.evaluate: only lockingBytecode: OP_2 OP_2 OP_ADD', async (t) => { - const sha256 = await instantiateSha256(); - const vm = await instantiateVirtualMachineBCH(); - const program = createTestAuthenticationProgramBCH({ - lockingBytecode: Uint8Array.from([ - OpcodesBCH.OP_2, - OpcodesBCH.OP_2, - OpcodesBCH.OP_ADD, - ]), - satoshis: hexToBin('0000000000000000'), - sha256, - unlockingBytecode: Uint8Array.of(), - }); - const result = vm.evaluate(program); - t.deepEqual(result, { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }); -}); - -test('[BCH VM] vm.debug: only lockingBytecode: OP_2 OP_2 OP_ADD', async (t) => { - const sha256 = await instantiateSha256(); - const vm = await instantiateVirtualMachineBCH(); - const program = createTestAuthenticationProgramBCH({ - lockingBytecode: Uint8Array.from([ - OpcodesBCH.OP_2, - OpcodesBCH.OP_2, - OpcodesBCH.OP_ADD, - ]), - satoshis: hexToBin('0000000000000000'), - sha256, - unlockingBytecode: Uint8Array.of(), - }); - const result = vm.debug(program); - t.deepEqual(result, [ - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 0, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 1, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02)], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 2, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 0, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x02), Uint8Array.of(0x02)], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - { - alternateStack: [], - correspondingOutput: hexToBin('000000000000000000'), - executionStack: [], - instructions: [ - { - opcode: 82, - }, - { - opcode: 82, - }, - { - opcode: 147, - }, - ], - ip: 3, - lastCodeSeparator: -1, - locktime: 0, - operationCount: 1, - outpointIndex: 0, - outpointTransactionHash: hexToBin( - 'e3d27808b1d16719d2690e9a30de9d69c52c33916a0c491d0aa0a98c56d6c2af' - ), - outputValue: hexToBin('0000000000000000'), - sequenceNumber: 4294967295, - signatureOperationsCount: 0, - signedMessages: [], - stack: [Uint8Array.of(0x04)], - transactionOutpoints: hexToBin( - 'afc2d6568ca9a00a1d490c6a91332cc5699dde309a0e69d21967d1b10878d2e300000000' - ), - transactionOutputs: hexToBin('000000000000000000'), - transactionSequenceNumbers: hexToBin('ffffffff'), - version: 1, - }, - ]); -}); diff --git a/src/lib/vm/instruction-sets/bch/bch.ts b/src/lib/vm/instruction-sets/bch/bch.ts deleted file mode 100644 index 414029fc..00000000 --- a/src/lib/vm/instruction-sets/bch/bch.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - instantiateRipemd160, - instantiateSecp256k1, - instantiateSha1, - instantiateSha256, -} from '../../../crypto/crypto'; -import { createAuthenticationVirtualMachine } from '../../virtual-machine'; - -import { - createInstructionSetBCH, - getFlagsForInstructionSetBCH, - instructionSetBCHCurrentStrict, -} from './bch-instruction-sets'; - -export * from './bch-descriptions'; -export * from './bch-errors'; -export * from './bch-instruction-sets'; -export * from './bch-opcodes'; -export * from './bch-operations'; -export * from './bch-types'; -export * from './fixtures/bitcoin-abc/bitcoin-abc-utils'; - -/** - * Initialize a virtual machine using the provided BCH instruction set. - * - * @param instructionSet - the VM version to instantiate – by default, the - * current "strict" VM is used (`instructionSetBCHCurrentStrict`) - */ -export const instantiateVirtualMachineBCH = async ( - instructionSet = instructionSetBCHCurrentStrict -) => { - const [sha1, sha256, ripemd160, secp256k1] = await Promise.all([ - instantiateSha1(), - instantiateSha256(), - instantiateRipemd160(), - instantiateSecp256k1(), - ]); - return createAuthenticationVirtualMachine( - createInstructionSetBCH({ - flags: getFlagsForInstructionSetBCH(instructionSet), - ripemd160, - secp256k1, - sha1, - sha256, - }) - ); -}; diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/bitcoin-abc-utils.ts b/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/bitcoin-abc-utils.ts deleted file mode 100644 index 6f70d488..00000000 --- a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/bitcoin-abc-utils.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - flattenBinArray, - hexToBin, - utf8ToBin, -} from '../../../../../format/format'; -import { bigIntToScriptNumber, encodeDataPush } from '../../../common/common'; -import { generateBytecodeMap } from '../../../instruction-sets-utils'; -import { OpcodesBCH } from '../../bch-opcodes'; - -export const bitcoinABCOpcodes = Object.entries( - generateBytecodeMap(OpcodesBCH) -).reduce<{ - readonly [opcode: string]: Uint8Array; -}>((acc, cur) => ({ ...acc, [cur[0].slice('OP_'.length)]: cur[1] }), { - PUSHDATA1: Uint8Array.of(OpcodesBCH.OP_PUSHDATA_1), // eslint-disable-line @typescript-eslint/naming-convention - PUSHDATA2: Uint8Array.of(OpcodesBCH.OP_PUSHDATA_2), // eslint-disable-line @typescript-eslint/naming-convention - PUSHDATA4: Uint8Array.of(OpcodesBCH.OP_PUSHDATA_4), // eslint-disable-line @typescript-eslint/naming-convention -}); - -/** - * Convert a string from Bitcoin ABC's `script_tests.json` text-format to - * bytecode. The string must be valid – this method attempts to convert all - * unmatched tokens to `BigInt`s. - * - * @privateRemarks - * This method doesn't use {@link compileScript} because of a slight - * incompatibility in the languages. In BTL, BigIntLiterals are a primitive - * type, and must be surrounded by a push statement (e.g. `<100>`) to push a - * number to the stack. In the `script_tests.json` text-format, numbers are - * assumed to be pushed. We could implement a transformation after the - * compiler's parse step, but because this format doesn't require any other - * features of the compiler, we opt to implement this as a simple method. - * @param abcScript - the script in Bitcoin ABC's `script_tests.json` text - * format - */ -export const assembleBitcoinABCScript = (abcScript: string) => - flattenBinArray( - abcScript - .split(' ') - .filter((token) => token !== '') - .map((token) => - token.startsWith('0x') - ? hexToBin(token.slice('0x'.length)) - : token.startsWith("'") - ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) - : (bitcoinABCOpcodes[token] as Uint8Array | undefined) === undefined - ? encodeDataPush(bigIntToScriptNumber(BigInt(token))) - : bitcoinABCOpcodes[token] - ) - ); diff --git a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/script-tests-addendum.json b/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/script-tests-addendum.json deleted file mode 100644 index 58eac6cc..00000000 --- a/src/lib/vm/instruction-sets/bch/fixtures/bitcoin-abc/script-tests-addendum.json +++ /dev/null @@ -1,419 +0,0 @@ -{ - "notes": "This file describes modifications made to script_tests.json prior to testing in bch.spec.ts. To achieve better test coverage in the C++ implementation, some tests rely on quirks of old VM versions, strange combinations of flags, and other situations which should never happen in production (e.g. invalid signature encoding post-BCH fork). Rather than re-implementing those quirks, we modify or skip tests which are no-longer relevant. TODO: 'failRequiresReview' is a list of tests which are currently expected to fail, but for which we need to validate that failure is the correct result in the modern VMs.", - "failRequiresReview": [ - 556, - 557, - 1190, - 1192, - 1194, - 1196, - 1198, - 1201, - 1203, - 1223, - 1241, - 1253, - 1263, - 1265, - 1273, - 1274, - 1276, - 1278, - 1279, - 1282, - 1308, - 1310, - 1311, - 1339, - 1340, - 1341, - 1343, - 1344, - 1345, - 1346, - 1349, - 1350, - 1351, - 1353, - 1354, - 1355, - 1356, - 1383, - 1385, - 1387, - 1389, - 1394, - 1396, - 1398, - 1400, - 1404, - 1405, - 1406, - 1414, - 1416 - ], - "overrides": { - "locking": { - "204": "NOP1 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", - "205": "NOP1 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 'NOP_1_to_10' EQUAL" - }, - "unlocking": { - "205": "'NOP_1_to_10'", - "282": "1 2 3 4 5", - "283": "1", - "284": "1" - } - }, - "invalidUnlock": [ - 21, - 56, - 57, - 58, - 59, - 60, - 61, - 117, - 118, - 119, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 184, - 185, - 186, - 280, - 286, - 324, - 337, - 378, - 379, - 382, - 383, - 384, - 385, - 386, - 387, - 388, - 473, - 474, - 475, - 476, - 477, - 478, - 479, - 480, - 481, - 482, - 483, - 484, - 485, - 486, - 487, - 488, - 489, - 490, - 491, - 492, - 727 - ], - "dirtyStack": [ - 60, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 82, - 83, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 282, - 283, - 284, - 313, - 314, - 331, - 332, - 333, - 334, - 335, - 336, - 337, - 339, - 341, - 342, - 343, - 344, - 345, - 346, - 347, - 348, - 349, - 438, - 440, - 441, - 446, - 493, - 494, - 495, - 496, - 497, - 498, - 499, - 500, - 501, - 502, - 503, - 504, - 505, - 506, - 507, - 508, - 509, - 510, - 511, - 800, - 829 - ], - "fail": [ - 380, - 381, - 558, - 559, - 560, - 561, - 562, - 563, - 564, - 565, - 1159, - 1160, - 1161, - 1162, - 1163, - 1164, - 1167, - 1168, - 1169, - 1171, - 1172, - 1174, - 1175, - 1199, - 1205, - 1207, - 1209, - 1211, - 1215, - 1228, - 1230, - 1236, - 1240, - 1242, - 1244, - 1246, - 1250, - 1252, - 1255, - 1257, - 1259, - 1261, - 1267, - 1269, - 1270, - 1286, - 1288, - 1290, - 1292, - 1294, - 1300, - 1302, - 1304, - 1316, - 1318, - 1320, - 1322, - 1324, - 1330, - 1332, - 1334, - 1347, - 1367, - 1369, - 1401, - 1402, - 1409, - 1410, - 1412, - 1479, - 1480, - 1481, - 1483, - 1485, - 1488, - 1490 - ], - "pass": [ - 900, - 903, - 904, - 905, - 906, - 907, - 908, - 909, - 911, - 1358, - 1362, - 1370, - 1374, - 1419, - 1422 - ], - "minimalIf": [1447, 1449, 1460, 1463, 1465, 1477], - "useStrict": [ - 1084, - 1085, - 1086, - 1087, - 1088, - 1089, - 1090, - 1091, - 1092, - 1093, - 1094, - 1095, - 1096, - 1097, - 1098, - 1099, - 1100, - 1101, - 1102, - 1103, - 1104, - 1105, - 1106, - 1107, - 1108, - 1109, - 1110, - 1111, - 1112, - 1113, - 1114, - 1115, - 1116, - 1117, - 1118, - 1119, - 1120, - 1121, - 1122, - 1123, - 1124, - 1125, - 1126, - 1127, - 1128, - 1129, - 1130, - 1131, - 1132, - 1133, - 1134, - 1135, - 1136, - 1137, - 1138, - 1139, - 1140, - 1141, - 1142, - 1143, - 1144, - 1145, - 1146, - 1147, - 1148, - 1149, - 1150, - 1151, - 1152, - 1153, - 1154, - 1155, - 1156, - 1157, - 1158 - ] -} diff --git a/src/lib/vm/instruction-sets/common/descriptions.ts b/src/lib/vm/instruction-sets/btc/btc-descriptions.ts similarity index 65% rename from src/lib/vm/instruction-sets/common/descriptions.ts rename to src/lib/vm/instruction-sets/btc/btc-descriptions.ts index 18ecb181..93420ed5 100644 --- a/src/lib/vm/instruction-sets/common/descriptions.ts +++ b/src/lib/vm/instruction-sets/btc/btc-descriptions.ts @@ -1,5 +1,5 @@ -export enum OpcodeDescriptionsCommon { - OP_0 = 'Push the Script Number 0 onto the stack.', +export enum OpcodeDescriptionsBTC { + OP_0 = 'Push the VM Number 0 onto the stack.', OP_PUSHBYTES_1 = 'Push the next byte onto the stack.', OP_PUSHBYTES_2 = 'Push the next 2 bytes onto the stack.', OP_PUSHBYTES_3 = 'Push the next 3 bytes onto the stack.', @@ -78,32 +78,32 @@ export enum OpcodeDescriptionsCommon { OP_PUSHDATA_1 = 'Read the next Uint8 and push that number of bytes onto the stack.', OP_PUSHDATA_2 = 'Read the next little-endian Uint16 and push that number of bytes onto the stack.', OP_PUSHDATA_4 = 'Read the next little-endian Uint32 and push that number of bytes onto the stack.', - OP_1NEGATE = 'Push the Script Number -1 onto the stack.', + OP_1NEGATE = 'Push the VM Number -1 onto the stack.', OP_RESERVED = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED does not count toward the opcode limit.', - OP_1 = 'Push the Script Number 1 onto the stack.', - OP_2 = 'Push the Script Number 2 onto the stack.', - OP_3 = 'Push the Script Number 3 onto the stack.', - OP_4 = 'Push the Script Number 4 onto the stack.', - OP_5 = 'Push the Script Number 5 onto the stack.', - OP_6 = 'Push the Script Number 6 onto the stack.', - OP_7 = 'Push the Script Number 7 onto the stack.', - OP_8 = 'Push the Script Number 8 onto the stack.', - OP_9 = 'Push the Script Number 9 onto the stack.', - OP_10 = 'Push the Script Number 10 onto the stack.', - OP_11 = 'Push the Script Number 11 onto the stack.', - OP_12 = 'Push the Script Number 12 onto the stack.', - OP_13 = 'Push the Script Number 13 onto the stack.', - OP_14 = 'Push the Script Number 14 onto the stack.', - OP_15 = 'Push the Script Number 15 onto the stack.', - OP_16 = 'Push the Script Number 16 onto the stack.', + OP_1 = 'Push a 1 (VM Number) onto the stack.', + OP_2 = 'Push a 2 (VM Number) onto the stack.', + OP_3 = 'Push a 3 (VM Number) onto the stack.', + OP_4 = 'Push a 4 (VM Number) onto the stack.', + OP_5 = 'Push a 5 (VM Number) onto the stack.', + OP_6 = 'Push a 6 (VM Number) onto the stack.', + OP_7 = 'Push a 7 (VM Number) onto the stack.', + OP_8 = 'Push a 8 (VM Number) onto the stack.', + OP_9 = 'Push a 9 (VM Number) onto the stack.', + OP_10 = 'Push a 10 (VM Number) onto the stack.', + OP_11 = 'Push a 11 (VM Number) onto the stack.', + OP_12 = 'Push a 12 (VM Number) onto the stack.', + OP_13 = 'Push a 13 (VM Number) onto the stack.', + OP_14 = 'Push a 14 (VM Number) onto the stack.', + OP_15 = 'Push a 15 (VM Number) onto the stack.', + OP_16 = 'Push a 16 (VM Number) onto the stack.', OP_NOP = 'No operation. Note: OP_NOP counts toward the opcode limit.', OP_VER = 'Error unless found in an unexecuted conditional branch. Note: OP_VER counts toward the opcode limit. (Historically, this pushed a protocol version number to the stack.)', - OP_IF = 'Pop the top item from the stack. If it is not "truthy", skip evaluation until the matching OP_ELSE or OP_ENDIF.', - OP_NOTIF = 'Evaluate OP_NOT followed by OP_IF.', + OP_IF = 'Pop the top item from the stack. If it is not "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', + OP_NOTIF = 'Pop the top item from the stack. If it is "truthy", skip evaluation until a matching OP_ELSE or OP_ENDIF.', OP_VERIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_IF.)', OP_VERNOTIF = 'Error, even when found in an unexecuted conditional branch. (Historically, this was a combination of OP_VER and OP_NOTIF.)', OP_ELSE = 'Invert conditional evaluation within the current OP_IF ... OP_ENDIF block. (If evaluation is enabled, disable it, if it is disabled, enable it.)', - OP_ENDIF = 'End the current OP_IF ... OP_ENDIF block.', + OP_ENDIF = 'End the current OP_IF/OP_NOTIF ... OP_ENDIF block.', OP_VERIFY = 'Pop the top item from the stack and error if it isn\'t "truthy".', OP_RETURN = 'Error when executed.', OP_TOALTSTACK = 'Pop the top item from the stack and push it onto the alternate stack.', @@ -115,13 +115,13 @@ export enum OpcodeDescriptionsCommon { OP_2ROT = 'Rotate the top 6 items on the stack, bringing the fifth and sixth items to the top. (E.g. [a, b, c, d, e, f] -> [c, d, e, f, a, b])', OP_2SWAP = 'Swap the positions of the top two pairs of items on the stack. (E.g. [a, b, c, d] -> [c, d, a, b])', OP_IFDUP = 'If the top item on the stack is "truthy", duplicate it.', - OP_DEPTH = 'Push the current number of stack items as a Script Number.', + OP_DEPTH = 'Push the current number of stack items as a VM Number.', OP_DROP = 'Pop the top item from the stack and discard it. (E.g. [a] -> [])', OP_DUP = 'Duplicate the top item on the stack. (E.g. [a] -> [a, a])', OP_NIP = 'Remove the second-to-top item from the stack. (E.g. [a, b] -> [b])', OP_OVER = 'Duplicate the second-to-top item on the stack. (E.g. [a, b] -> [a, b, a])', - OP_PICK = 'Pop the top item from the stack as a Script Number. Duplicate the item at that depth (zero-indexed), placing it on top of the stack. (E.g. [a, b, c, 2] -> [a, b, c, a])', - OP_ROLL = 'Pop the top item from the stack as a Script Number. Move the item at that depth (zero-indexed) to the top of the stack. (E.g. [a, b, c, 2] -> [b, c, a])', + OP_PICK = 'Pop the top item from the stack as a VM Number. Duplicate the item at that depth (zero-indexed), placing it on top of the stack. (E.g. [a, b, c, 2] -> [a, b, c, a])', + OP_ROLL = 'Pop the top item from the stack as a VM Number. Move the item at that depth (zero-indexed) to the top of the stack. (E.g. [a, b, c, 2] -> [b, c, a])', OP_ROT = 'Rotate the top 3 items on the stack, bringing the third item to the top. (E.g. [a, b, c] -> [b, c, a])', OP_SWAP = 'Swap the top two items on the stack. (E.g. [a, b] -> [b, a])', OP_TUCK = 'Duplicate the item at the top of the stack, inserting it below the second-to-top item. (E.g. [a, b] -> [b, a, b])', @@ -129,55 +129,55 @@ export enum OpcodeDescriptionsCommon { OP_SUBSTR = 'Error, even when found in an unexecuted conditional branch. (Historically, this returned a section of a stack item.)', OP_LEFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this returned a section to the left of a point in a stack item.)', OP_RIGHT = 'Error, even when found in an unexecuted conditional branch. (Historically, this returned a section to the right of a point in a stack item.)', - OP_SIZE = 'Push the byte-length of the top stack item as a Script Number.', + OP_SIZE = 'Push the byte-length of the top stack item as a VM Number.', OP_INVERT = 'Error, even when found in an unexecuted conditional branch. (Historically, this flipped all the bits in a stack item.)', OP_AND = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a boolean AND on each bit in two stack items.)', OP_OR = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a boolean OR on each bit in two stack items.)', OP_XOR = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a boolean XOR on each bit in two stack items.)', - OP_EQUAL = 'Pop the top two items from the stack and compare them byte-by-byte. If they are the same, push a Script Number 1, otherwise push a Script Number 0.', + OP_EQUAL = 'Pop the top two items from the stack and compare them byte-by-byte. If they are the same, push a 1 (VM Number), otherwise push a 0 (VM Number).', OP_EQUALVERIFY = 'Pop the top two items from the stack and compare them byte-by-byte. If the values are different, error. (This operation is a combination of OP_EQUAL followed by OP_VERIFY.)', OP_RESERVED1 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED1 counts toward the opcode limit.', OP_RESERVED2 = 'Error unless found in an unexecuted conditional branch. Note: OP_RESERVED2 counts toward the opcode limit.', - OP_1ADD = 'Pop the top item from the stack as a Script Number, add 1, then push the result.', - OP_1SUB = 'Pop the top item from the stack as a Script Number, subtract 1, then push the result.', - OP_2MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied a Script Number by 2.)', - OP_2DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided a Script Number by 2.)', - OP_NEGATE = 'Pop the top item from the stack as a Script Number, negate it, then push the result.', - OP_ABS = 'Pop the top item from the stack as a Script Number, take its absolute value, then push the result.', - OP_NOT = 'Pop the top item from the stack as a Script Number. If its value is 0, push a Script Number 1, otherwise, push a Script Number 0.', - OP_0NOTEQUAL = 'Pop the top item from the stack as a Script Number. If its value is not 0, push a Script Number 1, otherwise, push a Script Number 0.', - OP_ADD = 'Pop the top two items from the stack as Script Numbers. Add them, then push the result.', - OP_SUB = 'Pop the top two items from the stack as Script Numbers. Subtract the top item from the second item, then push the result.', - OP_MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied two Script Numbers.)', - OP_DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided two Script Numbers.)', - OP_MOD = 'Error, even when found in an unexecuted conditional branch. (Historically, this returned the remainder after dividing one Script Number by another.)', + OP_MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied two VM Numbers.)', + OP_DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided a VM Number by another.)', + OP_MOD = 'Error, even when found in an unexecuted conditional branch. (Historically, this returned the remainder after dividing one VM Number by another.)', + OP_1ADD = 'Pop the top item from the stack as a VM Number, add 1, then push the result.', + OP_1SUB = 'Pop the top item from the stack as a VM Number, subtract 1, then push the result.', + OP_2MUL = 'Error, even when found in an unexecuted conditional branch. (Historically, this multiplied a VM Number by 2.)', + OP_2DIV = 'Error, even when found in an unexecuted conditional branch. (Historically, this divided a VM Number by 2.)', + OP_NEGATE = 'Pop the top item from the stack as a VM Number, negate it, then push the result.', + OP_ABS = 'Pop the top item from the stack as a VM Number, take its absolute value, then push the result.', + OP_NOT = 'Pop the top item from the stack as a VM Number. If its value is 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_0NOTEQUAL = 'Pop the top item from the stack as a VM Number. If its value is not 0, push a 1 (VM Number), otherwise, push a 0 (VM Number).', + OP_ADD = 'Pop the top two items from the stack as VM Numbers. Add them, then push the result.', + OP_SUB = 'Pop the top two items from the stack as VM Numbers. Subtract the top item from the second item, then push the result.', OP_LSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, left bit shift.)', OP_RSHIFT = 'Error, even when found in an unexecuted conditional branch. (Historically, this performed a sign-preserving, right bit shift.)', - OP_BOOLAND = 'Pop the top two items from the stack as Script Numbers. If neither value is a Script Number 0, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_BOOLOR = 'Pop the top two items from the stack as Script Numbers. If either value is a Script Number 1, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_NUMEQUAL = 'Pop the top two items from the stack as Script Numbers. If the values are equal, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_NUMEQUALVERIFY = 'Pop the top two items from the stack as Script Numbers. If the values are different, error. (This operation is a combination of OP_NUMEQUAL followed by OP_VERIFY.)', - OP_NUMNOTEQUAL = 'Pop the top two items from the stack as Script Numbers. If the values are not equal, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_LESSTHAN = 'Pop the top two items from the stack as Script Numbers. If the second item is less than top item, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_GREATERTHAN = 'Pop the top two items from the stack as Script Numbers. If the second item is greater than top item, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_LESSTHANOREQUAL = 'Pop the top two items from the stack as Script Numbers. If the second item is less than or equal to the top item, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_GREATERTHANOREQUAL = 'Pop the top two items from the stack as Script Numbers. If the second item is greater than or equal to the top item, push a Script Number 1. Otherwise, push a Script Number 0.', - OP_MIN = 'Pop the top two items from the stack as Script Numbers. Push the smaller of the two numbers.', - OP_MAX = 'Pop the top two items from the stack as Script Numbers. Push the larger of the two numbers.', - OP_WITHIN = 'Pop the top three items from the stack as Script Numbers. If the top number is within the range defined by the following two numbers (left-inclusive), push a Script Number 1. Otherwise, push a Script Number 0. (E.g. for [a, b, c]: if (b <= a), and (a < c), [1]. Else [0].)', + OP_BOOLAND = 'Pop the top two items from the stack as VM Numbers. If neither value is a 0 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_BOOLOR = 'Pop the top two items from the stack as VM Numbers. If either value is a 1 (VM Number), push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_NUMEQUALVERIFY = 'Pop the top two items from the stack as VM Numbers. If the values are different, error. (This operation is a combination of OP_NUMEQUAL followed by OP_VERIFY.)', + OP_NUMNOTEQUAL = 'Pop the top two items from the stack as VM Numbers. If the values are not equal, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is less than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHAN = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_LESSTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is less than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_GREATERTHANOREQUAL = 'Pop the top two items from the stack as VM Numbers. If the second item is greater than or equal to the top item, push a 1 (VM Number). Otherwise, push a 0 (VM Number).', + OP_MIN = 'Pop the top two items from the stack as VM Numbers. Push the smaller of the two numbers.', + OP_MAX = 'Pop the top two items from the stack as VM Numbers. Push the larger of the two numbers.', + OP_WITHIN = 'Pop the top three items from the stack as VM Numbers. If the top number is within the range defined by the following two numbers (left-inclusive), push a 1 (VM Number). Otherwise, push a 0 (VM Number). (E.g. for [a, b, c]: if (b <= a), and (a < c), [1]. Else [0].)', OP_RIPEMD160 = 'Pop the top item from the stack and pass it through ripemd160, pushing the result onto the stack.', OP_SHA1 = 'Pop the top item from the stack and pass it through sha1, pushing the result onto the stack.', OP_SHA256 = 'Pop the top item from the stack and pass it through sha256, pushing the result onto the stack.', OP_HASH160 = 'Pop the top item from the stack and pass it through sha256, then ripemd160, pushing the result onto the stack.', OP_HASH256 = 'Pop the top item from the stack and pass it through sha256 twice, pushing the result onto the stack.', OP_CODESEPARATOR = "Update the value of lastCodeSeparator to the instruction pointer's current value. (This reduces the coverage of signing serializations used in signature verification operations.)", - OP_CHECKSIG = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is valid, push a Script Number 1, otherwise push a Script Number 0.', + OP_CHECKSIG = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is valid, push a 1 (VM Number), otherwise push a 0 (VM Number).', OP_CHECKSIGVERIFY = 'Pop the top two items from the stack. Treat the top as a signature and the second as a public key. If the signature is not valid, error. (This operation is a combination of OP_CHECKSIG followed by OP_VERIFY.)', - OP_CHECKMULTISIG = 'Pop items from the stack: first pop the Script Number of public keys, then pop each of those public keys. Next, pop the Script Number of required signatures, then pop each of those signatures. Finally, pop a final Script Number which must be 0 due to a protocol bug. Checking each signature against each public key in order, if all signatures are valid – and the required number of signatures have been provided – push a Script Number 1, otherwise push a Script Number 0.', - OP_CHECKMULTISIGVERIFY = 'Pop items from the stack: first pop the Script Number of public keys, then pop each of those public keys. Next, pop the Script Number of required signatures, then pop each of those signatures. Finally, (due to a protocol bug) pop an unused final Script Number which must be 0. Checking each signature against each public key in order, if any signatures are invalid – or the required number of signatures have not been provided – error. (This operation is a combination of OP_CHECKMULTISIG followed by OP_VERIFY.)', + OP_CHECKMULTISIG = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, pop a final VM Number that must be 0 due to a protocol bug. Checking each signature against each public key in order, if all signatures are valid – and the required number of signatures have been provided – push a 1 (VM Number), otherwise push a 0 (VM Number).', + OP_CHECKMULTISIGVERIFY = 'Pop items from the stack: first pop the VM Number of public keys, then pop each of those public keys. Next, pop the VM Number of required signatures, then pop each of those signatures. Finally, (due to a protocol bug) pop an unused final VM Number that must be 0. Checking each signature against each public key in order, if any signatures are invalid – or the required number of signatures have not been provided – error. (This operation is a combination of OP_CHECKMULTISIG followed by OP_VERIFY.)', OP_NOP1 = 'No operation (reserved for future expansion). Note: OP_NOP1 counts toward the opcode limit.', - OP_CHECKLOCKTIMEVERIFY = "Verify the transaction occurs after an absolute block time or height: read the top item on the stack as a Script Number (without removing it), and compare it to the transaction's locktime. If the required locktime has not passed, or if locktime has been disabled for this input by a maximized sequence number, error.", - OP_CHECKSEQUENCEVERIFY = 'Verify the transaction occurs after the output being spent has "aged" by a relative block time or block height since it was created: read the top item on the stack as a Script Number (without removing it), and compare it to the age encoded in the input\'s sequence number. If the required relative locktime has not passed, or if relative locktime has been disabled by the sequence number or the transaction version, error.', + OP_CHECKLOCKTIMEVERIFY = "Verify the transaction occurs after an absolute block time or height: read the top item on the stack as a VM Number (without removing it), and compare it to the transaction's locktime. If the required locktime has not passed, or if locktime has been disabled for this input by a maximized sequence number, error.", + OP_CHECKSEQUENCEVERIFY = 'Verify the transaction occurs after the output being spent has "aged" by a relative block time or block height since it was created: read the top item on the stack as a VM Number (without removing it), and compare it to the age encoded in the input\'s sequence number. If the required relative locktime has not passed, or if relative locktime has been disabled by the sequence number or the transaction version, error.', OP_NOP4 = 'No operation (reserved for future expansion). Note: OP_NOP4 counts toward the opcode limit.', OP_NOP6 = 'No operation (reserved for future expansion). Note: OP_NOP6 counts toward the opcode limit.', OP_NOP5 = 'No operation (reserved for future expansion). Note: OP_NOP5 counts toward the opcode limit.', diff --git a/src/lib/vm/instruction-sets/bch/bch-opcodes.ts b/src/lib/vm/instruction-sets/btc/btc-opcodes.ts similarity index 70% rename from src/lib/vm/instruction-sets/bch/bch-opcodes.ts rename to src/lib/vm/instruction-sets/btc/btc-opcodes.ts index 03820a9f..89af5685 100644 --- a/src/lib/vm/instruction-sets/bch/bch-opcodes.ts +++ b/src/lib/vm/instruction-sets/btc/btc-opcodes.ts @@ -1,7 +1,7 @@ -export enum OpcodesBCH { - /** - * A.K.A. `OP_FALSE` or `OP_PUSHBYTES_0` - */ +/** + * `OpcodesBTC` currently represents the `BTC_2017_08` instruction set. + */ +export enum OpcodesBTC { OP_0 = 0x00, OP_PUSHBYTES_1 = 0x01, OP_PUSHBYTES_2 = 0x02, @@ -83,9 +83,6 @@ export enum OpcodesBCH { OP_PUSHDATA_4 = 0x4e, OP_1NEGATE = 0x4f, OP_RESERVED = 0x50, - /** - * A.K.A. `OP_TRUE` - */ OP_1 = 0x51, OP_2 = 0x52, OP_3 = 0x53, @@ -132,9 +129,9 @@ export enum OpcodesBCH { OP_SWAP = 0x7c, OP_TUCK = 0x7d, OP_CAT = 0x7e, - OP_SPLIT = 0x7f, - OP_NUM2BIN = 0x80, - OP_BIN2NUM = 0x81, + OP_SUBSTR = 0x7f, + OP_LEFT = 0x80, + OP_RIGHT = 0x81, OP_SIZE = 0x82, OP_INVERT = 0x83, OP_AND = 0x84, @@ -182,13 +179,7 @@ export enum OpcodesBCH { OP_CHECKMULTISIG = 0xae, OP_CHECKMULTISIGVERIFY = 0xaf, OP_NOP1 = 0xb0, - /** - * Previously `OP_NOP2` - */ OP_CHECKLOCKTIMEVERIFY = 0xb1, - /** - * Previously `OP_NOP2` - */ OP_CHECKSEQUENCEVERIFY = 0xb2, OP_NOP4 = 0xb3, OP_NOP5 = 0xb4, @@ -197,21 +188,9 @@ export enum OpcodesBCH { OP_NOP8 = 0xb7, OP_NOP9 = 0xb8, OP_NOP10 = 0xb9, - /** - * Previously `OP_UNKNOWN186` - */ - OP_CHECKDATASIG = 0xba, - /** - * Previously `OP_UNKNOWN187` - */ - OP_CHECKDATASIGVERIFY = 0xbb, - /** - * Previously `OP_UNKNOWN188` - */ - OP_REVERSEBYTES = 0xbc, - /** - * A.K.A. `FIRST_UNDEFINED_OP_VALUE` - */ + OP_UNKNOWN186 = 0xba, + OP_UNKNOWN187 = 0xbb, + OP_UNKNOWN188 = 0xbc, OP_UNKNOWN189 = 0xbd, OP_UNKNOWN190 = 0xbe, OP_UNKNOWN191 = 0xbf, @@ -263,9 +242,6 @@ export enum OpcodesBCH { OP_UNKNOWN237 = 0xed, OP_UNKNOWN238 = 0xee, OP_UNKNOWN239 = 0xef, - /** - * A.K.A. `OP_PREFIX_BEGIN` - */ OP_UNKNOWN240 = 0xf0, OP_UNKNOWN241 = 0xf1, OP_UNKNOWN242 = 0xf2, @@ -273,88 +249,28 @@ export enum OpcodesBCH { OP_UNKNOWN244 = 0xf4, OP_UNKNOWN245 = 0xf5, OP_UNKNOWN246 = 0xf6, - /** - * A.K.A. `OP_PREFIX_END` - */ OP_UNKNOWN247 = 0xf7, OP_UNKNOWN248 = 0xf8, OP_UNKNOWN249 = 0xf9, - OP_UNKNOWN250 = 0xfa, - OP_UNKNOWN251 = 0xfb, - OP_UNKNOWN252 = 0xfc, - OP_UNKNOWN253 = 0xfd, - OP_UNKNOWN254 = 0xfe, - OP_UNKNOWN255 = 0xff, -} - -export enum OpcodeAlternateNamesBCH { /** - * A.K.A. `OP_0` - */ - OP_FALSE = 0x00, - /** - * A.K.A. `OP_0` - */ - OP_PUSHBYTES_0 = 0x00, - /** - * A.K.A. `OP_1` - */ - OP_TRUE = 0x51, - /** - * A.K.A. `OP_CHECKLOCKTIMEVERIFY` - */ - OP_NOP2 = 0xb1, - /** - * A.K.A. `OP_CHECKSEQUENCEVERIFY` - */ - OP_NOP3 = 0xb2, - /** - * A.K.A. `OP_CHECKDATASIG` - */ - OP_UNKNOWN186 = 0xba, - /** - * A.K.A. `OP_CHECKDATASIGVERIFY` - */ - OP_UNKNOWN187 = 0xbb, - /** - * A.K.A. `OP_UNKNOWN189` - */ - FIRST_UNDEFINED_OP_VALUE = 0xbd, - /** - * A.K.A. `OP_UNKNOWN240`. Some implementations have reserved opcodes - * `0xf0` through `0xf7` for a future range of multi-byte opcodes, though none - * are yet available on the network. - */ - OP_PREFIX_BEGIN = 0xf0, - /** - * A.K.A. `OP_UNKNOWN247`. Some implementations have reserved opcodes - * `0xf0` through `0xf7` for a future range of multi-byte opcodes, though none - * are yet available on the network. - */ - OP_PREFIX_END = 0xf7, - /** - * `OP_SMALLINTEGER` is used internally for template matching in the C++ - * implementation. When found on the network, it is `OP_UNKNOWN250`. + * Used internally in the C++ implementation. */ OP_SMALLINTEGER = 0xfa, /** - * `OP_PUBKEYS` is used internally for template matching in the C++ - * implementation. When found on the network, it is `OP_UNKNOWN251`. + * Used internally in the C++ implementation. */ OP_PUBKEYS = 0xfb, + OP_UNKNOWN252 = 0xfc, /** - * `OP_PUBKEYHASH` is used internally for template matching in the C++ - * implementation. When found on the network, it is `OP_UNKNOWN253`. + * Used internally in the C++ implementation. */ OP_PUBKEYHASH = 0xfd, /** - * `OP_PUBKEY` is used internally for template matching in the C++ - * implementation. When found on the network, it is `OP_UNKNOWN254`. + * Used internally in the C++ implementation. */ OP_PUBKEY = 0xfe, /** - * `OP_INVALIDOPCODE` is described as such for testing in the C++ - * implementation. When found on the network, it is `OP_UNKNOWN255`. + * Used internally in the C++ implementation. */ OP_INVALIDOPCODE = 0xff, } diff --git a/src/lib/vm/instruction-sets/btc/btc-types.ts b/src/lib/vm/instruction-sets/btc/btc-types.ts new file mode 100644 index 00000000..4f978d41 --- /dev/null +++ b/src/lib/vm/instruction-sets/btc/btc-types.ts @@ -0,0 +1,9 @@ +import type { AuthenticationProgramStateCommon } from '../../../lib'; + +export interface SegWitState { + readonly witnessBytecode: Uint8Array; +} + +export interface AuthenticationProgramStateBTC + extends AuthenticationProgramStateCommon, + SegWitState {} diff --git a/src/lib/vm/instruction-sets/btc/btc.ts b/src/lib/vm/instruction-sets/btc/btc.ts index db53be13..690067a3 100644 --- a/src/lib/vm/instruction-sets/btc/btc.ts +++ b/src/lib/vm/instruction-sets/btc/btc.ts @@ -1,283 +1,3 @@ -import { AuthenticationProgramStateBCH } from '../bch/bch'; - -export interface SegWitState { - readonly witnessBytecode: Uint8Array; -} - -export interface AuthenticationProgramStateBTC - extends AuthenticationProgramStateBCH, - SegWitState {} - -export enum OpcodesBTC { - OP_0 = 0x00, - OP_PUSHBYTES_1 = 0x01, - OP_PUSHBYTES_2 = 0x02, - OP_PUSHBYTES_3 = 0x03, - OP_PUSHBYTES_4 = 0x04, - OP_PUSHBYTES_5 = 0x05, - OP_PUSHBYTES_6 = 0x06, - OP_PUSHBYTES_7 = 0x07, - OP_PUSHBYTES_8 = 0x08, - OP_PUSHBYTES_9 = 0x09, - OP_PUSHBYTES_10 = 0x0a, - OP_PUSHBYTES_11 = 0x0b, - OP_PUSHBYTES_12 = 0x0c, - OP_PUSHBYTES_13 = 0x0d, - OP_PUSHBYTES_14 = 0x0e, - OP_PUSHBYTES_15 = 0x0f, - OP_PUSHBYTES_16 = 0x10, - OP_PUSHBYTES_17 = 0x11, - OP_PUSHBYTES_18 = 0x12, - OP_PUSHBYTES_19 = 0x13, - OP_PUSHBYTES_20 = 0x14, - OP_PUSHBYTES_21 = 0x15, - OP_PUSHBYTES_22 = 0x16, - OP_PUSHBYTES_23 = 0x17, - OP_PUSHBYTES_24 = 0x18, - OP_PUSHBYTES_25 = 0x19, - OP_PUSHBYTES_26 = 0x1a, - OP_PUSHBYTES_27 = 0x1b, - OP_PUSHBYTES_28 = 0x1c, - OP_PUSHBYTES_29 = 0x1d, - OP_PUSHBYTES_30 = 0x1e, - OP_PUSHBYTES_31 = 0x1f, - OP_PUSHBYTES_32 = 0x20, - OP_PUSHBYTES_33 = 0x21, - OP_PUSHBYTES_34 = 0x22, - OP_PUSHBYTES_35 = 0x23, - OP_PUSHBYTES_36 = 0x24, - OP_PUSHBYTES_37 = 0x25, - OP_PUSHBYTES_38 = 0x26, - OP_PUSHBYTES_39 = 0x27, - OP_PUSHBYTES_40 = 0x28, - OP_PUSHBYTES_41 = 0x29, - OP_PUSHBYTES_42 = 0x2a, - OP_PUSHBYTES_43 = 0x2b, - OP_PUSHBYTES_44 = 0x2c, - OP_PUSHBYTES_45 = 0x2d, - OP_PUSHBYTES_46 = 0x2e, - OP_PUSHBYTES_47 = 0x2f, - OP_PUSHBYTES_48 = 0x30, - OP_PUSHBYTES_49 = 0x31, - OP_PUSHBYTES_50 = 0x32, - OP_PUSHBYTES_51 = 0x33, - OP_PUSHBYTES_52 = 0x34, - OP_PUSHBYTES_53 = 0x35, - OP_PUSHBYTES_54 = 0x36, - OP_PUSHBYTES_55 = 0x37, - OP_PUSHBYTES_56 = 0x38, - OP_PUSHBYTES_57 = 0x39, - OP_PUSHBYTES_58 = 0x3a, - OP_PUSHBYTES_59 = 0x3b, - OP_PUSHBYTES_60 = 0x3c, - OP_PUSHBYTES_61 = 0x3d, - OP_PUSHBYTES_62 = 0x3e, - OP_PUSHBYTES_63 = 0x3f, - OP_PUSHBYTES_64 = 0x40, - OP_PUSHBYTES_65 = 0x41, - OP_PUSHBYTES_66 = 0x42, - OP_PUSHBYTES_67 = 0x43, - OP_PUSHBYTES_68 = 0x44, - OP_PUSHBYTES_69 = 0x45, - OP_PUSHBYTES_70 = 0x46, - OP_PUSHBYTES_71 = 0x47, - OP_PUSHBYTES_72 = 0x48, - OP_PUSHBYTES_73 = 0x49, - OP_PUSHBYTES_74 = 0x4a, - OP_PUSHBYTES_75 = 0x4b, - OP_PUSHDATA_1 = 0x4c, - OP_PUSHDATA_2 = 0x4d, - OP_PUSHDATA_4 = 0x4e, - OP_1NEGATE = 0x4f, - OP_RESERVED = 0x50, - OP_1 = 0x51, - OP_2 = 0x52, - OP_3 = 0x53, - OP_4 = 0x54, - OP_5 = 0x55, - OP_6 = 0x56, - OP_7 = 0x57, - OP_8 = 0x58, - OP_9 = 0x59, - OP_10 = 0x5a, - OP_11 = 0x5b, - OP_12 = 0x5c, - OP_13 = 0x5d, - OP_14 = 0x5e, - OP_15 = 0x5f, - OP_16 = 0x60, - OP_NOP = 0x61, - OP_VER = 0x62, - OP_IF = 0x63, - OP_NOTIF = 0x64, - OP_VERIF = 0x65, - OP_VERNOTIF = 0x66, - OP_ELSE = 0x67, - OP_ENDIF = 0x68, - OP_VERIFY = 0x69, - OP_RETURN = 0x6a, - OP_TOALTSTACK = 0x6b, - OP_FROMALTSTACK = 0x6c, - OP_2DROP = 0x6d, - OP_2DUP = 0x6e, - OP_3DUP = 0x6f, - OP_2OVER = 0x70, - OP_2ROT = 0x71, - OP_2SWAP = 0x72, - OP_IFDUP = 0x73, - OP_DEPTH = 0x74, - OP_DROP = 0x75, - OP_DUP = 0x76, - OP_NIP = 0x77, - OP_OVER = 0x78, - OP_PICK = 0x79, - OP_ROLL = 0x7a, - OP_ROT = 0x7b, - OP_SWAP = 0x7c, - OP_TUCK = 0x7d, - OP_CAT = 0x7e, - OP_SUBSTR = 0x7f, - OP_LEFT = 0x80, - OP_RIGHT = 0x81, - OP_SIZE = 0x82, - OP_INVERT = 0x83, - OP_AND = 0x84, - OP_OR = 0x85, - OP_XOR = 0x86, - OP_EQUAL = 0x87, - OP_EQUALVERIFY = 0x88, - OP_RESERVED1 = 0x89, - OP_RESERVED2 = 0x8a, - OP_1ADD = 0x8b, - OP_1SUB = 0x8c, - OP_2MUL = 0x8d, - OP_2DIV = 0x8e, - OP_NEGATE = 0x8f, - OP_ABS = 0x90, - OP_NOT = 0x91, - OP_0NOTEQUAL = 0x92, - OP_ADD = 0x93, - OP_SUB = 0x94, - OP_MUL = 0x95, - OP_DIV = 0x96, - OP_MOD = 0x97, - OP_LSHIFT = 0x98, - OP_RSHIFT = 0x99, - OP_BOOLAND = 0x9a, - OP_BOOLOR = 0x9b, - OP_NUMEQUAL = 0x9c, - OP_NUMEQUALVERIFY = 0x9d, - OP_NUMNOTEQUAL = 0x9e, - OP_LESSTHAN = 0x9f, - OP_GREATERTHAN = 0xa0, - OP_LESSTHANOREQUAL = 0xa1, - OP_GREATERTHANOREQUAL = 0xa2, - OP_MIN = 0xa3, - OP_MAX = 0xa4, - OP_WITHIN = 0xa5, - OP_RIPEMD160 = 0xa6, - OP_SHA1 = 0xa7, - OP_SHA256 = 0xa8, - OP_HASH160 = 0xa9, - OP_HASH256 = 0xaa, - OP_CODESEPARATOR = 0xab, - OP_CHECKSIG = 0xac, - OP_CHECKSIGVERIFY = 0xad, - OP_CHECKMULTISIG = 0xae, - OP_CHECKMULTISIGVERIFY = 0xaf, - OP_NOP1 = 0xb0, - OP_CHECKLOCKTIMEVERIFY = 0xb1, - OP_CHECKSEQUENCEVERIFY = 0xb2, - OP_NOP4 = 0xb3, - OP_NOP5 = 0xb4, - OP_NOP6 = 0xb5, - OP_NOP7 = 0xb6, - OP_NOP8 = 0xb7, - OP_NOP9 = 0xb8, - OP_NOP10 = 0xb9, - OP_UNKNOWN186 = 0xba, - OP_UNKNOWN187 = 0xbb, - OP_UNKNOWN188 = 0xbc, - OP_UNKNOWN189 = 0xbd, - OP_UNKNOWN190 = 0xbe, - OP_UNKNOWN191 = 0xbf, - OP_UNKNOWN192 = 0xc0, - OP_UNKNOWN193 = 0xc1, - OP_UNKNOWN194 = 0xc2, - OP_UNKNOWN195 = 0xc3, - OP_UNKNOWN196 = 0xc4, - OP_UNKNOWN197 = 0xc5, - OP_UNKNOWN198 = 0xc6, - OP_UNKNOWN199 = 0xc7, - OP_UNKNOWN200 = 0xc8, - OP_UNKNOWN201 = 0xc9, - OP_UNKNOWN202 = 0xca, - OP_UNKNOWN203 = 0xcb, - OP_UNKNOWN204 = 0xcc, - OP_UNKNOWN205 = 0xcd, - OP_UNKNOWN206 = 0xce, - OP_UNKNOWN207 = 0xcf, - OP_UNKNOWN208 = 0xd0, - OP_UNKNOWN209 = 0xd1, - OP_UNKNOWN210 = 0xd2, - OP_UNKNOWN211 = 0xd3, - OP_UNKNOWN212 = 0xd4, - OP_UNKNOWN213 = 0xd5, - OP_UNKNOWN214 = 0xd6, - OP_UNKNOWN215 = 0xd7, - OP_UNKNOWN216 = 0xd8, - OP_UNKNOWN217 = 0xd9, - OP_UNKNOWN218 = 0xda, - OP_UNKNOWN219 = 0xdb, - OP_UNKNOWN220 = 0xdc, - OP_UNKNOWN221 = 0xdd, - OP_UNKNOWN222 = 0xde, - OP_UNKNOWN223 = 0xdf, - OP_UNKNOWN224 = 0xe0, - OP_UNKNOWN225 = 0xe1, - OP_UNKNOWN226 = 0xe2, - OP_UNKNOWN227 = 0xe3, - OP_UNKNOWN228 = 0xe4, - OP_UNKNOWN229 = 0xe5, - OP_UNKNOWN230 = 0xe6, - OP_UNKNOWN231 = 0xe7, - OP_UNKNOWN232 = 0xe8, - OP_UNKNOWN233 = 0xe9, - OP_UNKNOWN234 = 0xea, - OP_UNKNOWN235 = 0xeb, - OP_UNKNOWN236 = 0xec, - OP_UNKNOWN237 = 0xed, - OP_UNKNOWN238 = 0xee, - OP_UNKNOWN239 = 0xef, - OP_UNKNOWN240 = 0xf0, - OP_UNKNOWN241 = 0xf1, - OP_UNKNOWN242 = 0xf2, - OP_UNKNOWN243 = 0xf3, - OP_UNKNOWN244 = 0xf4, - OP_UNKNOWN245 = 0xf5, - OP_UNKNOWN246 = 0xf6, - OP_UNKNOWN247 = 0xf7, - OP_UNKNOWN248 = 0xf8, - OP_UNKNOWN249 = 0xf9, - /** - * Used internally in the C++ implementation. - */ - OP_SMALLINTEGER = 0xfa, - /** - * Used internally in the C++ implementation. - */ - OP_PUBKEYS = 0xfb, - OP_UNKNOWN252 = 0xfc, - /** - * Used internally in the C++ implementation. - */ - OP_PUBKEYHASH = 0xfd, - /** - * Used internally in the C++ implementation. - */ - OP_PUBKEY = 0xfe, - /** - * Used internally in the C++ implementation. - */ - OP_INVALIDOPCODE = 0xff, -} +export * from './btc-descriptions.js'; +export * from './btc-opcodes.js'; +export * from './btc-types.js'; diff --git a/src/lib/vm/instruction-sets/common/arithmetic.ts b/src/lib/vm/instruction-sets/common/arithmetic.ts index 658c698a..55e7c46f 100644 --- a/src/lib/vm/instruction-sets/common/arithmetic.ts +++ b/src/lib/vm/instruction-sets/common/arithmetic.ts @@ -1,398 +1,270 @@ -import { - AuthenticationProgramStateCommon, +import type { AuthenticationProgramStateError, AuthenticationProgramStateStack, -} from '../../vm-types'; +} from '../../../lib'; import { combineOperations, pushToStack, - useOneScriptNumber, - useThreeScriptNumbers, - useTwoScriptNumbers, -} from './combinators'; -import { opVerify } from './flow-control'; -import { OpcodesCommon } from './opcodes'; -import { bigIntToScriptNumber, booleanToScriptNumber } from './types'; + pushToStackVmNumberChecked, + useOneVmNumber, + useThreeVmNumbers, + useTwoVmNumbers, +} from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { opVerify } from './flow-control.js'; +import { + bigIntToVmNumber, + booleanToVmNumber, +} from './instruction-sets-utils.js'; export const op1Add = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack(nextState, bigIntToScriptNumber(value + BigInt(1))), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStackVmNumberChecked(nextState, value + BigInt(1)) ); export const op1Sub = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack(nextState, bigIntToScriptNumber(value - BigInt(1))), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(value - BigInt(1))) ); export const opNegate = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack(nextState, bigIntToScriptNumber(-value)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(-value)) ); export const opAbs = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack(nextState, bigIntToScriptNumber(value < 0 ? -value : value)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)) ); export const opNot = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack( - nextState, - value === BigInt(0) - ? bigIntToScriptNumber(BigInt(1)) - : bigIntToScriptNumber(BigInt(0)) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStack( + nextState, + value === BigInt(0) + ? bigIntToVmNumber(BigInt(1)) + : bigIntToVmNumber(BigInt(0)) + ) ); export const op0NotEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, [value]) => - pushToStack( - nextState, - value === BigInt(0) - ? bigIntToScriptNumber(BigInt(0)) - : bigIntToScriptNumber(BigInt(1)) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, [value]) => + pushToStack( + nextState, + value === BigInt(0) + ? bigIntToVmNumber(BigInt(0)) + : bigIntToVmNumber(BigInt(1)) + ) ); export const opAdd = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, bigIntToScriptNumber(firstValue + secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStackVmNumberChecked(nextState, firstValue + secondValue) ); export const opSub = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, bigIntToScriptNumber(firstValue - secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)) ); export const opBoolAnd = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack( - nextState, - booleanToScriptNumber( - firstValue !== BigInt(0) && secondValue !== BigInt(0) - ) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + booleanToVmNumber(firstValue !== BigInt(0) && secondValue !== BigInt(0)) + ) ); export const opBoolOr = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack( - nextState, - booleanToScriptNumber( - firstValue !== BigInt(0) || secondValue !== BigInt(0) - ) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + booleanToVmNumber(firstValue !== BigInt(0) || secondValue !== BigInt(0)) + ) ); export const opNumEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue === secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)) ); -export const opNumEqualVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => - combineOperations( - opNumEqual(flags), - opVerify() - ); +export const opNumEqualVerify = combineOperations(opNumEqual, opVerify); export const opNumNotEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue !== secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)) ); export const opLessThan = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue < secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)) ); export const opLessThanOrEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue <= secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)) ); export const opGreaterThan = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue > secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)) ); export const opGreaterThanOrEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToScriptNumber(firstValue >= secondValue)), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)) ); export const opMin = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack( - nextState, - bigIntToScriptNumber( - firstValue < secondValue ? firstValue : secondValue - ) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) + ) ); export const opMax = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useTwoScriptNumbers( - state, - (nextState, [firstValue, secondValue]) => - pushToStack( - nextState, - bigIntToScriptNumber( - firstValue > secondValue ? firstValue : secondValue - ) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStack( + nextState, + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) + ) ); export const opWithin = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useThreeScriptNumbers( - state, - (nextState, [firstValue, secondValue, thirdValue]) => - pushToStack( - nextState, - booleanToScriptNumber( - secondValue <= firstValue && firstValue < thirdValue - ) - ), - { requireMinimalEncoding } + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useThreeVmNumbers(state, (nextState, [firstValue, secondValue, thirdValue]) => + pushToStack( + nextState, + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) + ) + ); + +export const opMul = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + pushToStackVmNumberChecked(nextState, firstValue * secondValue) + ); + +export const opDiv = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + secondValue === BigInt(0) + ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) + : pushToStack(nextState, bigIntToVmNumber(firstValue / secondValue)) ); -export const arithmeticOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => ({ - [OpcodesCommon.OP_1ADD]: op1Add(flags), - [OpcodesCommon.OP_1SUB]: op1Sub(flags), - [OpcodesCommon.OP_NEGATE]: opNegate(flags), - [OpcodesCommon.OP_ABS]: opAbs(flags), - [OpcodesCommon.OP_NOT]: opNot(flags), - [OpcodesCommon.OP_0NOTEQUAL]: op0NotEqual(flags), - [OpcodesCommon.OP_ADD]: opAdd(flags), - [OpcodesCommon.OP_SUB]: opSub(flags), - [OpcodesCommon.OP_BOOLAND]: opBoolAnd(flags), - [OpcodesCommon.OP_BOOLOR]: opBoolOr(flags), - [OpcodesCommon.OP_NUMEQUAL]: opNumEqual(flags), - [OpcodesCommon.OP_NUMEQUALVERIFY]: opNumEqualVerify(flags), - [OpcodesCommon.OP_NUMNOTEQUAL]: opNumNotEqual(flags), - [OpcodesCommon.OP_LESSTHAN]: opLessThan(flags), - [OpcodesCommon.OP_LESSTHANOREQUAL]: opLessThanOrEqual(flags), - [OpcodesCommon.OP_GREATERTHAN]: opGreaterThan(flags), - [OpcodesCommon.OP_GREATERTHANOREQUAL]: opGreaterThanOrEqual( - flags - ), - [OpcodesCommon.OP_MIN]: opMin(flags), - [OpcodesCommon.OP_MAX]: opMax(flags), - [OpcodesCommon.OP_WITHIN]: opWithin(flags), -}); +export const opMod = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => + secondValue === BigInt(0) + ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) + : pushToStack(nextState, bigIntToVmNumber(firstValue % secondValue)) + ); diff --git a/src/lib/vm/instruction-sets/common/bitwise.ts b/src/lib/vm/instruction-sets/common/bitwise.ts index 0b196797..aca1552e 100644 --- a/src/lib/vm/instruction-sets/common/bitwise.ts +++ b/src/lib/vm/instruction-sets/common/bitwise.ts @@ -1,18 +1,17 @@ -import { Operation } from '../../virtual-machine'; -import { - AuthenticationProgramStateCommon, +import type { AuthenticationProgramStateError, AuthenticationProgramStateStack, -} from '../../vm-types'; + Operation, +} from '../../../lib'; import { combineOperations, pushToStack, useTwoStackItems, -} from './combinators'; -import { opVerify } from './flow-control'; -import { OpcodesCommon } from './opcodes'; -import { booleanToScriptNumber } from './types'; +} from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { opVerify } from './flow-control.js'; +import { booleanToVmNumber } from './instruction-sets-utils.js'; const areEqual = (a: Uint8Array, b: Uint8Array) => { if (a.length !== b.length) { @@ -28,26 +27,54 @@ const areEqual = (a: Uint8Array, b: Uint8Array) => { }; export const opEqual = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->(): Operation => (state: State) => + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => useTwoStackItems(state, (nextState, [element1, element2]) => - pushToStack(nextState, booleanToScriptNumber(areEqual(element1, element2))) + pushToStack(nextState, booleanToVmNumber(areEqual(element1, element2))) ); -export const opEqualVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->(): Operation => - combineOperations(opEqual(), opVerify()); - -export const bitwiseOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->() => ({ - [OpcodesCommon.OP_EQUAL]: opEqual(), - [OpcodesCommon.OP_EQUALVERIFY]: opEqualVerify(), -}); +export const opEqualVerify = combineOperations(opEqual, opVerify); + +export const bitwiseOperation = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack + >( + combine: (a: Uint8Array, b: Uint8Array) => Uint8Array + ): Operation => + (state: State) => + useTwoStackItems(state, (nextState, [a, b]) => + a.length === b.length + ? pushToStack(nextState, combine(a, b)) + : applyError( + nextState, + AuthenticationErrorCommon.mismatchedBitwiseOperandLength + ) + ); + +// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion +export const opAnd = bitwiseOperation((a, b) => a.map((v, i) => v & b[i]!)) as < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => State; + +// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion +export const opOr = bitwiseOperation((a, b) => a.map((v, i) => v | b[i]!)) as < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => State; + +// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion +export const opXor = bitwiseOperation((a, b) => a.map((v, i) => v ^ b[i]!)) as < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => State; diff --git a/src/lib/vm/instruction-sets/common/combinators.ts b/src/lib/vm/instruction-sets/common/combinators.ts index 0f212e8b..25ce9cd1 100644 --- a/src/lib/vm/instruction-sets/common/combinators.ts +++ b/src/lib/vm/instruction-sets/common/combinators.ts @@ -1,52 +1,55 @@ -import { - InstructionSetOperationMapping, - Operation, -} from '../../virtual-machine'; -import { +import type { + AuthenticationProgramStateControlStack, AuthenticationProgramStateError, - AuthenticationProgramStateExecutionStack, AuthenticationProgramStateStack, -} from '../../vm-types'; + InstructionSetOperationMapping, + Operation, +} from '../../../lib'; -import { isScriptNumberError, parseBytesAsScriptNumber } from './common'; -import { applyError, AuthenticationErrorCommon } from './errors'; +import { ConsensusCommon } from './consensus.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { + bigIntToVmNumber, + decodeVmNumber, + isVmNumberError, +} from './instruction-sets-utils.js'; -export const incrementOperationCount = < - State extends { operationCount: number } ->( - operation: Operation -): Operation => (state: State) => { - const nextState = operation(state); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - nextState.operationCount += 1; - return nextState; -}; +export const incrementOperationCount = + ( + operation: Operation + ): Operation => + (state: State) => { + const nextState = operation(state); + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + nextState.operationCount += 1; + return nextState; + }; -export const conditionallyEvaluate = < - State extends AuthenticationProgramStateExecutionStack ->( - operation: Operation -): Operation => (state: State) => - state.executionStack.every((item) => item) ? operation(state) : state; +export const conditionallyEvaluate = + ( + operation: Operation + ): Operation => + (state: State) => + state.controlStack.every((item) => item) ? operation(state) : state; /** - * Map a function over each operation in an `InstructionSet.operations` object, - * assigning the result to the same `opcode` in the resulting object. - * @param operations - an operations map from an `InstructionSet` - * @param combinator - a function to apply to each operation + * Map a function over each operation in an {@link InstructionSet.operations} + * object, assigning the result to the same `opcode` in the resulting object. + * @param operationMap - an operations map from an {@link InstructionSet} + * @param combinators - a list of functions to apply (in order) to + * each operation */ export const mapOverOperations = ( - operations: InstructionSetOperationMapping, - ...combinators: ((operation: Operation) => Operation)[] + combinators: ((operation: Operation) => Operation)[], + operationMap: InstructionSetOperationMapping ) => - Object.keys(operations).reduce<{ - [opcode: number]: Operation; - }>( - (result, operation) => ({ + Object.keys(operationMap).reduce>( + (result, opcode) => ({ ...result, - [operation]: combinators.reduce( + [opcode]: combinators.reduce>( (op, combinator) => combinator(op), - operations[parseInt(operation, 10)] + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + operationMap[Number(opcode)]! ), }), {} @@ -56,9 +59,8 @@ export const mapOverOperations = ( * Pop one stack item off of `state.stack` and provide that item to `operation`. */ export const useOneStackItem = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: (nextState: State, [value]: [Uint8Array]) => State @@ -66,18 +68,14 @@ export const useOneStackItem = < // eslint-disable-next-line functional/immutable-data const item = state.stack.pop(); if (item === undefined) { - return applyError( - AuthenticationErrorCommon.emptyStack, - state - ); + return applyError(state, AuthenticationErrorCommon.emptyStack); } return operation(state, [item]); }; export const useTwoStackItems = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -92,9 +90,8 @@ export const useTwoStackItems = < ); export const useThreeStackItems = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -109,9 +106,8 @@ export const useThreeStackItems = < ); export const useFourStackItems = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -131,9 +127,8 @@ export const useFourStackItems = < ); export const useSixStackItems = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -163,38 +158,39 @@ export const useSixStackItems = < ) ); -const normalMaximumScriptNumberByteLength = 4; +const typicalMaximumVmNumberByteLength = 8; -export const useOneScriptNumber = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors +export const useOneVmNumber = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: (nextState: State, [value]: [bigint]) => State, { - requireMinimalEncoding, - maximumScriptNumberByteLength = normalMaximumScriptNumberByteLength, - }: { requireMinimalEncoding: boolean; maximumScriptNumberByteLength?: number } + maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, + requireMinimalEncoding = true, + }: { + maximumVmNumberByteLength?: number; + requireMinimalEncoding?: boolean; + } = { + maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, + requireMinimalEncoding: true, + } ) => useOneStackItem(state, (nextState, [item]) => { - const value = parseBytesAsScriptNumber(item, { - maximumScriptNumberByteLength, + const value = decodeVmNumber(item, { + maximumVmNumberByteLength, requireMinimalEncoding, }); - if (isScriptNumberError(value)) { - return applyError( - AuthenticationErrorCommon.invalidScriptNumber, - state - ); + if (isVmNumberError(value)) { + return applyError(state, AuthenticationErrorCommon.invalidVmNumber); } return operation(nextState, [value]); }); -export const useTwoScriptNumbers = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors +export const useTwoVmNumbers = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -202,26 +198,37 @@ export const useTwoScriptNumbers = < [firstValue, secondValue]: [bigint, bigint] ) => State, { - requireMinimalEncoding, - maximumScriptNumberByteLength = normalMaximumScriptNumberByteLength, - }: { requireMinimalEncoding: boolean; maximumScriptNumberByteLength?: number } + maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, + requireMinimalEncoding = true, + }: { + maximumVmNumberByteLength?: number; + requireMinimalEncoding?: boolean; + } = { + maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, + requireMinimalEncoding: true, + } ) => - useOneScriptNumber( + useOneVmNumber( state, (nextState, [secondValue]) => - useOneScriptNumber( + useOneVmNumber( nextState, (lastState, [firstValue]) => operation(lastState, [firstValue, secondValue]), - { maximumScriptNumberByteLength, requireMinimalEncoding } + { + maximumVmNumberByteLength, + requireMinimalEncoding, + } ), - { maximumScriptNumberByteLength, requireMinimalEncoding } + { + maximumVmNumberByteLength, + requireMinimalEncoding, + } ); -export const useThreeScriptNumbers = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors +export const useThreeVmNumbers = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, operation: ( @@ -229,20 +236,32 @@ export const useThreeScriptNumbers = < [firstValue, secondValue, thirdValue]: [bigint, bigint, bigint] ) => State, { - requireMinimalEncoding, - maximumScriptNumberByteLength = normalMaximumScriptNumberByteLength, - }: { requireMinimalEncoding: boolean; maximumScriptNumberByteLength?: number } + maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, + requireMinimalEncoding = true, + }: { + maximumVmNumberByteLength?: number; + requireMinimalEncoding?: boolean; + } = { + maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, + requireMinimalEncoding: true, + } ) => - useTwoScriptNumbers( + useTwoVmNumbers( state, (nextState, [secondValue, thirdValue]) => - useOneScriptNumber( + useOneVmNumber( nextState, (lastState, [firstValue]) => operation(lastState, [firstValue, secondValue, thirdValue]), - { maximumScriptNumberByteLength, requireMinimalEncoding } + { + maximumVmNumberByteLength, + requireMinimalEncoding, + } ), - { maximumScriptNumberByteLength, requireMinimalEncoding } + { + maximumVmNumberByteLength, + requireMinimalEncoding, + } ); /** @@ -259,8 +278,57 @@ export const pushToStack = ( return state; }; -// TODO: if firstOperation errors, secondOperation might overwrite the error -export const combineOperations = ( - firstOperation: Operation, - secondOperation: Operation -) => (state: State) => secondOperation(firstOperation(state)); +/** + * If the provided item exceeds the maximum stack item length, apply an error. + * Otherwise, return the provided state with the item pushed to its stack. + * @param state - the state to update and return + * @param item - the value to push to the stack + */ +export const pushToStackChecked = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State, + item: Uint8Array, + maximumLength = ConsensusCommon.maximumStackItemLength +) => { + if (item.length > maximumLength) { + return applyError( + state, + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${item.length} bytes.` + ); + } + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + state.stack.push(item); + return state; +}; + +/** + * If the provided number is outside the VM number range, apply an error. + * Otherwise, return the provided state with the VM number pushed to its stack. + * @param state - the state to update and return + * @param vmNumber - the VM number to push to the stack + */ +export const pushToStackVmNumberChecked = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State, + vmNumber: bigint, + minVmNumber = BigInt(ConsensusCommon.minVmNumber), + maxVmNumber = BigInt(ConsensusCommon.maxVmNumber) + // eslint-disable-next-line max-params +) => { + if (vmNumber > maxVmNumber || vmNumber < minVmNumber) { + return applyError(state, AuthenticationErrorCommon.overflowsVmNumberRange); + } + return pushToStack(state, bigIntToVmNumber(vmNumber)); +}; + +export const combineOperations = + ( + firstOperation: Operation, + secondOperation: Operation + ) => + (state: State) => + secondOperation(firstOperation(state)); diff --git a/src/lib/vm/instruction-sets/common/common-types.ts b/src/lib/vm/instruction-sets/common/common-types.ts new file mode 100644 index 00000000..09f92711 --- /dev/null +++ b/src/lib/vm/instruction-sets/common/common-types.ts @@ -0,0 +1,203 @@ +import { hexToBin } from '../../../format/format.js'; +import type { + AuthenticationInstruction, + AuthenticationProgramCommon, + AuthenticationProgramStateAlternateStack, + AuthenticationProgramStateCommon, + AuthenticationProgramStateControlStack, + AuthenticationProgramStateError, + AuthenticationProgramStateInternalCommon, + AuthenticationProgramStateStack, + Input, + Operation, + Output, + TransactionCommon, +} from '../../../lib'; +import { + cloneTransactionCommon, + cloneTransactionOutputsCommon, +} from '../../../message/message.js'; + +import { conditionallyEvaluate } from './combinators.js'; +import { ConsensusCommon } from './consensus.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { cloneAuthenticationInstruction } from './instruction-sets-utils.js'; + +export const undefinedOperation = conditionallyEvaluate( + < + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError + >( + state: State + ) => applyError(state, AuthenticationErrorCommon.unknownOpcode) +); + +export const checkLimitsCommon = + < + State extends AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack & { operationCount: number } + >( + operation: Operation + ): Operation => + (state: State) => { + const nextState = operation(state); + return nextState.stack.length + nextState.alternateStack.length > + ConsensusCommon.maximumStackDepth + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumStackDepth + ) + : nextState.operationCount > ConsensusCommon.maximumOperationCount + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumOperationCount + ) + : nextState; + }; + +export const cloneStack = (stack: readonly Readonly[]) => + stack.map((item) => item.slice()); + +export const createAuthenticationProgramInternalStateCommon = ({ + instructions, + stack = [], +}: { + instructions: readonly AuthenticationInstruction[]; + stack?: Uint8Array[]; +}): AuthenticationProgramStateInternalCommon => ({ + alternateStack: [], + controlStack: [], + instructions, + ip: 0, + lastCodeSeparator: -1, + operationCount: 0, + signatureOperationsCount: 0, + signedMessages: [], + stack, +}); + +export const createAuthenticationProgramStateCommon = ({ + program, + instructions, + stack, +}: { + program: Readonly; + instructions: readonly AuthenticationInstruction[]; + stack: Uint8Array[]; +}): AuthenticationProgramStateCommon => ({ + ...createAuthenticationProgramInternalStateCommon({ + instructions, + stack, + }), + program, +}); + +export const cloneAuthenticationProgramCommon = < + Program extends AuthenticationProgramCommon +>( + program: Readonly +) => ({ + inputIndex: program.inputIndex, + sourceOutputs: cloneTransactionOutputsCommon(program.sourceOutputs), + transaction: cloneTransactionCommon(program.transaction), +}); + +export const cloneAuthenticationProgramStateCommon = < + State extends AuthenticationProgramStateCommon +>( + state: Readonly +) => ({ + ...(state.error === undefined ? {} : { error: state.error }), + alternateStack: cloneStack(state.alternateStack), + controlStack: state.controlStack.slice(), + instructions: state.instructions.map(cloneAuthenticationInstruction), + ip: state.ip, + lastCodeSeparator: state.lastCodeSeparator, + operationCount: state.operationCount, + program: cloneAuthenticationProgramCommon(state.program), + signatureOperationsCount: state.signatureOperationsCount, + signedMessages: cloneStack(state.signedMessages), + stack: cloneStack(state.stack), +}); + +export const cloneAuthenticationProgramStateBCH = + cloneAuthenticationProgramStateCommon; +export const cloneAuthenticationProgramState = + cloneAuthenticationProgramStateBCH; + +/** + * A reduced version of {@link AuthenticationProgramCommon} in which some + * transaction input `unlockingBytecode` values may be undefined. This context + * is required by the compiler to generate signatures. + * + * As of BCH 2022, `sourceOutputs.lockingBytecode` is not required for any + * signing serialization algorithms. However, this type requires each to be + * provided in anticipation of a future signing serialization algorithm that + * supports committing to UTXO bytecode values. + */ +export interface CompilationContext< + TransactionType extends TransactionCommon> +> { + inputIndex: number; + sourceOutputs: Output[]; + transaction: TransactionType; +} + +export type CompilationContextCommon = CompilationContext< + TransactionCommon> +>; + +const sha256HashLength = 32; +/** + * This is a meaningless but complete {@link CompilationContextCommon} that uses + * a different value for each property. This is useful for testing + * and debugging. + */ +// eslint-disable-next-line complexity +export const createCompilationContextCommonTesting = ({ + sourceOutputs, + inputs, + locktime, + version, + outputs, +}: { + sourceOutputs?: CompilationContextCommon['sourceOutputs']; + inputs?: CompilationContextCommon['transaction']['inputs']; + locktime?: CompilationContextCommon['transaction']['locktime']; + version?: CompilationContextCommon['transaction']['version']; + outputs?: CompilationContextCommon['transaction']['outputs']; +} = {}): CompilationContextCommon => ({ + inputIndex: 0, + sourceOutputs: sourceOutputs + ? sourceOutputs + : [ + { + lockingBytecode: Uint8Array.from([]), + valueSatoshis: hexToBin('ffffffffffffffff'), + }, + ], + transaction: { + inputs: inputs + ? inputs + : [ + { + outpointIndex: 0, + outpointTransactionHash: new Uint8Array(sha256HashLength).fill(1), + sequenceNumber: 0, + unlockingBytecode: undefined, + }, + ], + locktime: locktime === undefined ? 0 : locktime, + outputs: + outputs === undefined + ? [ + { + lockingBytecode: Uint8Array.from([]), + valueSatoshis: hexToBin('ffffffffffffffff'), + }, + ] + : outputs, + version: version === undefined ? 0 : version, + }, +}); diff --git a/src/lib/vm/instruction-sets/common/common.ts b/src/lib/vm/instruction-sets/common/common.ts index 3b3da04e..7f39e3a7 100644 --- a/src/lib/vm/instruction-sets/common/common.ts +++ b/src/lib/vm/instruction-sets/common/common.ts @@ -1,344 +1,22 @@ -import { - encodeOutpoints, - encodeOutput, - encodeOutputsForSigning, - encodeSequenceNumbersForSigning, -} from '../../../transaction/transaction-serialization'; -import { TransactionContextCommon } from '../../../transaction/transaction-types'; -import { Operation } from '../../virtual-machine'; -import { - AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateCommon, - AuthenticationProgramStateError, - AuthenticationProgramStateExecutionStack, - AuthenticationProgramStateInternalCommon, - AuthenticationProgramStateStack, - AuthenticationProgramTransactionContextCommon, -} from '../../vm-types'; -import { AuthenticationInstruction } from '../instruction-sets-types'; - -import { arithmeticOperations } from './arithmetic'; -import { bitwiseOperations } from './bitwise'; -import { - conditionallyEvaluate, - incrementOperationCount, - mapOverOperations, -} from './combinators'; -import { cryptoOperations, Ripemd160, Secp256k1, Sha1, Sha256 } from './crypto'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { - conditionalFlowControlOperations, - reservedOperation, - unconditionalFlowControlOperations, -} from './flow-control'; -import { disabledOperations, nonOperations } from './nop'; -import { OpcodesCommon } from './opcodes'; -import { pushNumberOperations, pushOperations } from './push'; -import { spliceOperations } from './splice'; -import { stackOperations } from './stack'; -import { timeOperations } from './time'; - -export * from './arithmetic'; -export * from './bitwise'; -export * from './combinators'; -export * from './crypto'; -export * from './descriptions'; -export * from './encoding'; -export * from './errors'; -export * from './flow-control'; -export * from './nop'; -export * from './opcodes'; -export * from './push'; -export * from './signing-serialization'; -export * from './splice'; -export * from './stack'; -export * from './time'; -export * from './types'; - -export enum ConsensusCommon { - /** - * A.K.A. `MAX_SCRIPT_ELEMENT_SIZE` - */ - maximumStackItemLength = 520, - maximumScriptNumberLength = 4, - /** - * A.K.A. `MAX_OPS_PER_SCRIPT` - */ - maximumOperationCount = 201, - /** - * A.K.A. `MAX_SCRIPT_SIZE` - */ - maximumBytecodeLength = 10000, - /** - * A.K.A. `MAX_STACK_SIZE` - */ - maximumStackDepth = 1000, -} - -export const undefinedOperation = < - State extends AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - Errors ->() => ({ - undefined: conditionallyEvaluate((state: State) => - applyError(AuthenticationErrorCommon.unknownOpcode, state) - ), -}); - -export const checkLimitsCommon = < - State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack & - AuthenticationProgramStateAlternateStack & { operationCount: number }, - Errors ->( - operation: Operation -): Operation => (state: State) => { - const nextState = operation(state); - return nextState.stack.length + nextState.alternateStack.length > - ConsensusCommon.maximumStackDepth - ? applyError( - AuthenticationErrorCommon.exceededMaximumStackDepth, - nextState - ) - : nextState.operationCount > ConsensusCommon.maximumOperationCount - ? applyError( - AuthenticationErrorCommon.exceededMaximumOperationCount, - nextState - ) - : nextState; -}; - -export const commonOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->({ - flags, - ripemd160, - secp256k1, - sha1, - sha256, -}: { - sha1: { hash: Sha1['hash'] }; - sha256: { hash: Sha256['hash'] }; - ripemd160: { hash: Ripemd160['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { - disallowUpgradableNops: boolean; - requireBugValueZero: boolean; - requireMinimalEncoding: boolean; - requireNullSignatureFailures: boolean; - }; -}): { readonly [opcodes: number]: Operation } => { - const unconditionalOperations = { - ...disabledOperations(), - ...pushOperations(flags), - ...mapOverOperations( - unconditionalFlowControlOperations(flags), - incrementOperationCount - ), - }; - const conditionalOperations = mapOverOperations( - { - ...pushNumberOperations(), - [OpcodesCommon.OP_RESERVED]: reservedOperation(), - }, - conditionallyEvaluate - ); - const incrementingOperations = mapOverOperations( - { - ...arithmeticOperations(flags), - ...bitwiseOperations(), - ...cryptoOperations({ - flags, - ripemd160, - secp256k1, - sha1, - sha256, - }), - ...conditionalFlowControlOperations(), - ...stackOperations(flags), - ...spliceOperations(), - ...timeOperations(flags), - ...nonOperations(flags), - }, - conditionallyEvaluate, - incrementOperationCount - ); - - return mapOverOperations( - { - ...unconditionalOperations, - ...incrementingOperations, - ...conditionalOperations, - }, - checkLimitsCommon - ); -}; - -export const cloneStack = (stack: readonly Readonly[]) => - stack.reduce((newStack, element) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - newStack.push(element.slice()); - return newStack; - }, []); - -export const createAuthenticationProgramInternalStateCommon = < - Opcodes, - Errors ->({ - instructions, - stack = [], -}: { - instructions: readonly AuthenticationInstruction[]; - stack?: Uint8Array[]; -}): AuthenticationProgramStateInternalCommon => ({ - alternateStack: [], - executionStack: [], - instructions, - ip: 0, - lastCodeSeparator: -1, - operationCount: 0, - signatureOperationsCount: 0, - signedMessages: [], - stack, -}); - -export const createTransactionContextCommon = ( - program: AuthenticationProgramTransactionContextCommon -): TransactionContextCommon => ({ - correspondingOutput: - program.inputIndex < program.spendingTransaction.outputs.length - ? encodeOutput(program.spendingTransaction.outputs[program.inputIndex]) - : undefined, - locktime: program.spendingTransaction.locktime, - outpointIndex: - program.spendingTransaction.inputs[program.inputIndex].outpointIndex, - outpointTransactionHash: - program.spendingTransaction.inputs[program.inputIndex] - .outpointTransactionHash, - outputValue: program.sourceOutput.satoshis, - sequenceNumber: - program.spendingTransaction.inputs[program.inputIndex].sequenceNumber, - transactionOutpoints: encodeOutpoints(program.spendingTransaction.inputs), - transactionOutputs: encodeOutputsForSigning( - program.spendingTransaction.outputs - ), - transactionSequenceNumbers: encodeSequenceNumbersForSigning( - program.spendingTransaction.inputs - ), - version: program.spendingTransaction.version, -}); - -export const createAuthenticationProgramStateCommon = ({ - transactionContext, - instructions, - stack, -}: { - transactionContext: TransactionContextCommon; - instructions: readonly AuthenticationInstruction[]; - stack: Uint8Array[]; -}): AuthenticationProgramStateCommon => ({ - ...createAuthenticationProgramInternalStateCommon({ - instructions, - stack, - }), - ...transactionContext, -}); - /** - * Note: this implementation does not safely clone elements within array - * properties. Mutating values within arrays will mutate those values in cloned - * program states. + * The "common" instruction set includes all virtual machine (VM) operations, + * types, and utilities that are used by more than one Libauth-supported VM. */ -export const cloneAuthenticationProgramStateCommon = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->( - state: State -) => ({ - ...(state.error === undefined ? {} : { error: state.error }), - alternateStack: state.alternateStack.slice(), - correspondingOutput: state.correspondingOutput, - executionStack: state.executionStack.slice(), - instructions: state.instructions.slice(), - ip: state.ip, - lastCodeSeparator: state.lastCodeSeparator, - locktime: state.locktime, - operationCount: state.operationCount, - outpointIndex: state.outpointIndex, - outpointTransactionHash: state.outpointTransactionHash.slice(), - outputValue: state.outputValue, - sequenceNumber: state.sequenceNumber, - signatureOperationsCount: state.signatureOperationsCount, - signedMessages: state.signedMessages.slice(), - stack: state.stack.slice(), - transactionOutpoints: state.transactionOutpoints, - transactionOutputs: state.transactionOutputs, - transactionSequenceNumbers: state.transactionSequenceNumbers, - version: state.version, -}); - -const sha256HashLength = 32; -const outputValueLength = 8; - -/** - * This is a meaningless but complete `TransactionContextCommon` which uses `0` - * values for each property. - */ -export const createTransactionContextCommonEmpty = () => ({ - correspondingOutput: Uint8Array.of(0), - locktime: 0, - outpointIndex: 0, - outpointTransactionHash: new Uint8Array(sha256HashLength), - outputValue: new Uint8Array(outputValueLength), - sequenceNumber: 0, - transactionOutpoints: Uint8Array.of(0), - transactionOutputs: Uint8Array.of(0), - transactionSequenceNumbers: Uint8Array.of(0), - version: 0, -}); - -const correspondingOutput = 1; -const transactionOutpoints = 2; -const transactionOutputs = 3; -const transactionSequenceNumbers = 4; -const outpointTransactionHashFill = 5; - -/** - * This is a meaningless but complete `TransactionContextCommon` which uses a - * different value for each property. This is useful for testing and debugging. - */ -export const createTransactionContextCommonTesting = () => ({ - correspondingOutput: Uint8Array.of(correspondingOutput), - locktime: 0, - outpointIndex: 0, - outpointTransactionHash: new Uint8Array(sha256HashLength).fill( - outpointTransactionHashFill - ), - outputValue: new Uint8Array(outputValueLength), - sequenceNumber: 0, - transactionOutpoints: Uint8Array.of(transactionOutpoints), - transactionOutputs: Uint8Array.of(transactionOutputs), - transactionSequenceNumbers: Uint8Array.of(transactionSequenceNumbers), - version: 0, -}); - -/** - * Create an "empty" common authentication program state, suitable for testing a - * VM/compiler. - */ -export const createAuthenticationProgramStateCommonEmpty = ({ - instructions, - stack = [], -}: { - instructions: readonly AuthenticationInstruction[]; - stack?: Uint8Array[]; -}): AuthenticationProgramStateCommon => ({ - ...createAuthenticationProgramInternalStateCommon({ instructions, stack }), - ...createTransactionContextCommonEmpty(), -}); +export * from './arithmetic.js'; +export * from './bitwise.js'; +export * from './combinators.js'; +export * from './common-types.js'; +export * from './consensus.js'; +export * from './crypto.js'; +export * from './encoding.js'; +export * from './errors.js'; +export * from './flow-control.js'; +export * from './format.js'; +export * from './inspection.js'; +export * from './instruction-sets-types.js'; +export * from './instruction-sets-utils.js'; +export * from './nop.js'; +export * from './push.js'; +export * from './signing-serialization.js'; +export * from './stack.js'; +export * from './time.js'; diff --git a/src/lib/vm/instruction-sets/common/consensus.ts b/src/lib/vm/instruction-sets/common/consensus.ts new file mode 100644 index 00000000..29b5f803 --- /dev/null +++ b/src/lib/vm/instruction-sets/common/consensus.ts @@ -0,0 +1,55 @@ +/** + * Consensus settings for the `BCH_2022_05` instruction set. + */ +export enum ConsensusCommon { + /** + * A.K.A. `MAX_SCRIPT_SIZE` + */ + maximumBytecodeLength = 10000, + /** + * A.K.A. `MAX_OP_RETURN_RELAY`, `nMaxDatacarrierBytes` + */ + maximumDataCarrierBytes = 223, + /** + * A.K.A. `MAX_OPS_PER_SCRIPT` + */ + maximumOperationCount = 201, + /** + * A.K.A. `MAX_STACK_SIZE` + */ + maximumStackDepth = 1000, + /** + * A.K.A. `MAX_SCRIPT_ELEMENT_SIZE` + */ + maximumStackItemLength = 520, + /** + * A.K.A. `MAX_STANDARD_VERSION` + */ + maximumStandardVersion = 2, + /** + * A.K.A. `MAX_TX_IN_SCRIPT_SIG_SIZE` + */ + maximumStandardUnlockingBytecodeLength = 1650, + /** + * A.K.A. `MIN_TX_SIZE` + */ + minimumTransactionSize = 100, + /** + * A.K.A. `MAX_STANDARD_TX_SIZE` + */ + maximumStandardTransactionSize = 100_000, + /** + * A.K.A. `MAX_TX_SIZE` + */ + maximumTransactionSize = 1_000_000, + /** + * A.K.A. `MAXIMUM_ELEMENT_SIZE_64_BIT` + */ + maximumVmNumberLength = 8, + minVmNumber = '-9223372036854775807', + maxVmNumber = '9223372036854775807', + schnorrSignatureLength = 64, +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const ConsensusBCH = ConsensusCommon; diff --git a/src/lib/vm/instruction-sets/common/crypto.ts b/src/lib/vm/instruction-sets/common/crypto.ts index 70c37371..e9861221 100644 --- a/src/lib/vm/instruction-sets/common/crypto.ts +++ b/src/lib/vm/instruction-sets/common/crypto.ts @@ -1,240 +1,235 @@ -import { Ripemd160, Secp256k1, Sha1, Sha256 } from '../../../crypto/crypto'; -import { Operation } from '../../virtual-machine'; import { + ripemd160 as internalRipemd160, + secp256k1 as internalSecp256k1, + sha1 as internalSha1, + sha256 as internalSha256, +} from '../../../crypto/default-crypto-instances.js'; +import type { AuthenticationProgramStateCommon, AuthenticationProgramStateError, AuthenticationProgramStateMinimum, + AuthenticationProgramStateSignatureAnalysis, AuthenticationProgramStateStack, -} from '../../vm-types'; -import { ConsensusBCH } from '../bch/bch-types'; -import { serializeAuthenticationInstructions } from '../instruction-sets-utils'; + Operation, + Ripemd160, + Secp256k1, + Sha1, + Sha256, +} from '../../../lib'; import { combineOperations, pushToStack, - useOneScriptNumber, useOneStackItem, + useOneVmNumber, + useThreeStackItems, useTwoStackItems, -} from './combinators'; -import { booleanToScriptNumber, ConsensusCommon } from './common'; +} from './combinators.js'; +import { ConsensusCommon } from './consensus.js'; import { decodeBitcoinSignature, - isValidPublicKeyEncoding, isValidSignatureEncodingBCHTransaction, -} from './encoding'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { opVerify } from './flow-control'; -import { OpcodesCommon } from './opcodes'; -import { generateSigningSerializationBCH } from './signing-serialization'; - -export { Ripemd160, Sha1, Sha256, Secp256k1 }; - -export const opRipemd160 = < - Opcodes, - State extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - ripemd160, -}: { - ripemd160: { hash: Ripemd160['hash'] }; -}): Operation => (state: State) => - useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(value)) - ); + isValidSignatureEncodingDER, +} from './encoding.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { opVerify } from './flow-control.js'; +import { + booleanToVmNumber, + encodeAuthenticationInstructions, + isValidPublicKeyEncoding, +} from './instruction-sets-utils.js'; +import { generateSigningSerializationBCH } from './signing-serialization.js'; + +export const opRipemd160 = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + { + ripemd160, + }: { + ripemd160: { hash: Ripemd160['hash'] }; + } = { ripemd160: internalRipemd160 } + ): Operation => + (state: State) => + useOneStackItem(state, (nextState, [value]) => + pushToStack(nextState, ripemd160.hash(value)) + ); -export const opSha1 = < - Opcodes, - State extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - sha1, -}: { - sha1: { hash: Sha1['hash'] }; -}): Operation => (state: State) => - useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha1.hash(value)) - ); +export const opSha1 = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + { + sha1, + }: { + sha1: { hash: Sha1['hash'] }; + } = { sha1: internalSha1 } + ): Operation => + (state: State) => + useOneStackItem(state, (nextState, [value]) => + pushToStack(nextState, sha1.hash(value)) + ); -export const opSha256 = < - Opcodes, - State extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - sha256, -}: { - sha256: { - hash: Sha256['hash']; - }; -}): Operation => (state: State) => - useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha256.hash(value)) - ); +export const opSha256 = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + { + sha256, + }: { + sha256: { + hash: Sha256['hash']; + }; + } = { sha256: internalSha256 } + ): Operation => + (state: State) => + useOneStackItem(state, (nextState, [value]) => + pushToStack(nextState, sha256.hash(value)) + ); -export const opHash160 = < - Opcodes, - State extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - ripemd160, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - ripemd160: { hash: Ripemd160['hash'] }; -}): Operation => (state: State) => - useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(sha256.hash(value))) - ); +export const opHash160 = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + { + ripemd160, + sha256, + }: { + sha256: { hash: Sha256['hash'] }; + ripemd160: { hash: Ripemd160['hash'] }; + } = { ripemd160: internalRipemd160, sha256: internalSha256 } + ): Operation => + (state: State) => + useOneStackItem(state, (nextState, [value]) => + pushToStack(nextState, ripemd160.hash(sha256.hash(value))) + ); -export const opHash256 = < - Opcodes, - State extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - sha256, -}: { - sha256: { - hash: Sha256['hash']; - }; -}): Operation => (state: State) => - useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha256.hash(sha256.hash(value))) - ); +export const opHash256 = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + { + sha256, + }: { + sha256: { + hash: Sha256['hash']; + }; + } = { sha256: internalSha256 } + ): Operation => + (state: State) => + useOneStackItem(state, (nextState, [value]) => + pushToStack(nextState, sha256.hash(sha256.hash(value))) + ); export const opCodeSeparator = < - Opcodes, - State extends AuthenticationProgramStateMinimum & { + State extends AuthenticationProgramStateMinimum & { lastCodeSeparator: number; } ->(): Operation => (state: State) => { +>( + state: State +) => { // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data state.lastCodeSeparator = state.ip; return state; }; -export const opCheckSig = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->({ - flags, - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { requireNullSignatureFailures: boolean }; -}): Operation => (s: State) => - // eslint-disable-next-line complexity - useTwoStackItems(s, (state, [bitcoinEncodedSignature, publicKey]) => { - if (!isValidPublicKeyEncoding(publicKey)) { - return applyError( - AuthenticationErrorCommon.invalidPublicKeyEncoding, - state +export const opCheckSig = + ( + { + secp256k1, + sha256, + }: { + sha256: { hash: Sha256['hash'] }; + secp256k1: { + verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + ): Operation => + (s: State) => + // eslint-disable-next-line complexity + useTwoStackItems(s, (state, [bitcoinEncodedSignature, publicKey]) => { + if (!isValidPublicKeyEncoding(publicKey)) { + return applyError( + state, + AuthenticationErrorCommon.invalidPublicKeyEncoding + ); + } + if (!isValidSignatureEncodingBCHTransaction(bitcoinEncodedSignature)) { + return applyError( + state, + AuthenticationErrorCommon.invalidSignatureEncoding + ); + } + const coveredBytecode = encodeAuthenticationInstructions( + state.instructions + ).subarray(state.lastCodeSeparator + 1); + const { signingSerializationType, signature } = decodeBitcoinSignature( + bitcoinEncodedSignature ); - } - if (!isValidSignatureEncodingBCHTransaction(bitcoinEncodedSignature)) { - return applyError( - AuthenticationErrorCommon.invalidSignatureEncoding, - state + + const serialization = generateSigningSerializationBCH( + state.program, + { coveredBytecode, signingSerializationType }, + sha256 ); - } - const coveredBytecode = serializeAuthenticationInstructions( - state.instructions - ).subarray(state.lastCodeSeparator + 1); - const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature - ); + const digest = sha256.hash(sha256.hash(serialization)); - const serialization = generateSigningSerializationBCH({ - correspondingOutput: state.correspondingOutput, - coveredBytecode, - locktime: state.locktime, - outpointIndex: state.outpointIndex, - outpointTransactionHash: state.outpointTransactionHash, - outputValue: state.outputValue, - sequenceNumber: state.sequenceNumber, - sha256, - signingSerializationType, - transactionOutpoints: state.transactionOutpoints, - transactionOutputs: state.transactionOutputs, - transactionSequenceNumbers: state.transactionSequenceNumbers, - version: state.version, + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + state.signedMessages.push(serialization); + + const useSchnorr = + signature.length === ConsensusCommon.schnorrSignatureLength; + const success = useSchnorr + ? secp256k1.verifySignatureSchnorr(signature, publicKey, digest) + : secp256k1.verifySignatureDERLowS(signature, publicKey, digest); + + return !success && signature.length !== 0 + ? applyError(state, AuthenticationErrorCommon.nonNullSignatureFailure) + : pushToStack(state, booleanToVmNumber(success)); }); - const digest = sha256.hash(sha256.hash(serialization)); - - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - state.signedMessages.push(serialization); - - const useSchnorr = signature.length === ConsensusBCH.schnorrSignatureLength; - const success = useSchnorr - ? secp256k1.verifySignatureSchnorr(signature, publicKey, digest) - : secp256k1.verifySignatureDERLowS(signature, publicKey, digest); - - return !success && - flags.requireNullSignatureFailures && - signature.length !== 0 - ? applyError( - AuthenticationErrorCommon.nonNullSignatureFailure, - state - ) - : pushToStack(state, booleanToScriptNumber(success)); - }); const enum Multisig { maximumPublicKeys = 20, } -export const opCheckMultiSig = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->({ - flags: { - requireMinimalEncoding, - requireBugValueZero, - requireNullSignatureFailures, - }, - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { - requireBugValueZero: boolean; - requireMinimalEncoding: boolean; - requireNullSignatureFailures: boolean; - }; -}) => (s: State) => - useOneScriptNumber( - s, - (state, publicKeysValue) => { +// TODO: implement schnorr multisig https://gitlab.com/bitcoin-cash-node/bchn-sw/bitcoincash-upgrade-specifications/-/blob/master/spec/2019-11-15-schnorrmultisig.md +export const opCheckMultiSig = + ( + { + secp256k1, + sha256, + }: { + sha256: { hash: Sha256['hash'] }; + secp256k1: { + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + ) => + (s: State) => + useOneVmNumber(s, (state, publicKeysValue) => { const potentialPublicKeys = Number(publicKeysValue); if (potentialPublicKeys < 0) { - return applyError( - AuthenticationErrorCommon.invalidNaturalNumber, - state + return applyError( + state, + AuthenticationErrorCommon.invalidNaturalNumber ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { - return applyError( - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, - state + return applyError( + state, + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount ); } const publicKeys = @@ -245,27 +240,27 @@ export const opCheckMultiSig = < state.operationCount += potentialPublicKeys; return state.operationCount > ConsensusCommon.maximumOperationCount - ? applyError( - AuthenticationErrorCommon.exceededMaximumOperationCount, - state + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount ) - : useOneScriptNumber( + : useOneVmNumber( state, (nextState, approvingKeys) => { const requiredApprovingPublicKeys = Number(approvingKeys); if (requiredApprovingPublicKeys < 0) { - return applyError( - AuthenticationErrorCommon.invalidNaturalNumber, - nextState + return applyError( + nextState, + AuthenticationErrorCommon.invalidNaturalNumber ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { - return applyError( - AuthenticationErrorCommon.insufficientPublicKeys, - nextState + return applyError( + nextState, + AuthenticationErrorCommon.insufficientPublicKeys ); } @@ -279,14 +274,14 @@ export const opCheckMultiSig = < nextState, // eslint-disable-next-line complexity (finalState, [protocolBugValue]) => { - if (requireBugValueZero && protocolBugValue.length !== 0) { - return applyError( - AuthenticationErrorCommon.invalidProtocolBugValue, - finalState + if (protocolBugValue.length !== 0) { + return applyError( + finalState, + AuthenticationErrorCommon.invalidProtocolBugValue ); } - const coveredBytecode = serializeAuthenticationInstructions( + const coveredBytecode = encodeAuthenticationInstructions( finalState.instructions ).subarray(finalState.lastCodeSeparator + 1); @@ -301,14 +296,16 @@ export const opCheckMultiSig = < remainingSignatures && approvingPublicKeys !== requiredApprovingPublicKeys ) { - const publicKey = publicKeys[remainingPublicKeys - 1]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const publicKey = publicKeys[remainingPublicKeys - 1]!; const bitcoinEncodedSignature = - signatures[remainingSignatures - 1]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + signatures[remainingSignatures - 1]!; if (!isValidPublicKeyEncoding(publicKey)) { - return applyError( - AuthenticationErrorCommon.invalidPublicKeyEncoding, - finalState + return applyError( + finalState, + AuthenticationErrorCommon.invalidPublicKeyEncoding ); } @@ -317,44 +314,32 @@ export const opCheckMultiSig = < bitcoinEncodedSignature ) ) { - return applyError( - AuthenticationErrorCommon.invalidSignatureEncoding, - finalState + return applyError( + finalState, + AuthenticationErrorCommon.invalidSignatureEncoding ); } - const { - signingSerializationType, - signature, - } = decodeBitcoinSignature(bitcoinEncodedSignature); - - const serialization = generateSigningSerializationBCH({ - correspondingOutput: state.correspondingOutput, - coveredBytecode, - locktime: state.locktime, - outpointIndex: state.outpointIndex, - outpointTransactionHash: state.outpointTransactionHash, - outputValue: state.outputValue, - sequenceNumber: state.sequenceNumber, - sha256, - signingSerializationType, - transactionOutpoints: state.transactionOutpoints, - transactionOutputs: state.transactionOutputs, - transactionSequenceNumbers: - state.transactionSequenceNumbers, - version: state.version, - }); + const { signingSerializationType, signature } = + decodeBitcoinSignature(bitcoinEncodedSignature); + + const serialization = generateSigningSerializationBCH( + state.program, + { coveredBytecode, signingSerializationType }, + sha256 + ); const digest = sha256.hash(sha256.hash(serialization)); // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data finalState.signedMessages.push(serialization); if ( - signature.length === ConsensusBCH.schnorrSignatureLength + signature.length === + ConsensusCommon.schnorrSignatureLength ) { - return applyError( - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, - finalState + return applyError( + finalState, + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig ); } @@ -377,57 +362,40 @@ export const opCheckMultiSig = < if ( !success && - requireNullSignatureFailures && !signatures.every((signature) => signature.length === 0) ) { - return applyError( - AuthenticationErrorCommon.nonNullSignatureFailure, - finalState + return applyError( + finalState, + AuthenticationErrorCommon.nonNullSignatureFailure ); } - return pushToStack( - finalState, - booleanToScriptNumber(success) - ); + return pushToStack(finalState, booleanToVmNumber(success)); } ); - }, - { requireMinimalEncoding } + } ); - }, - { requireMinimalEncoding } - ); + }); export const opCheckSigVerify = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->({ - flags, - secp256k1, - sha256, -}: { - sha256: { hash: Sha256['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { - requireNullSignatureFailures: boolean; - }; -}): Operation => - combineOperations( - opCheckSig({ flags, secp256k1, sha256 }), - opVerify() - ); + State extends AuthenticationProgramStateCommon +>( + { + secp256k1, + sha256, + }: { + sha256: { hash: Sha256['hash'] }; + secp256k1: { + verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + } = { secp256k1: internalSecp256k1, sha256: internalSha256 } +): Operation => + combineOperations(opCheckSig({ secp256k1, sha256 }), opVerify); export const opCheckMultiSigVerify = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors + State extends AuthenticationProgramStateCommon >({ - flags, secp256k1, sha256, }: { @@ -435,70 +403,89 @@ export const opCheckMultiSigVerify = < secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - flags: { - requireBugValueZero: boolean; - requireMinimalEncoding: boolean; - requireNullSignatureFailures: boolean; - }; }): Operation => - combineOperations( - opCheckMultiSig({ flags, secp256k1, sha256 }), - opVerify() - ); - -export const cryptoOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->({ - flags, - ripemd160, - secp256k1, - sha1, - sha256, -}: { - sha1: { hash: Sha1['hash'] }; - sha256: { hash: Sha256['hash'] }; - ripemd160: { hash: Ripemd160['hash'] }; - secp256k1: { - verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; - verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; - }; - flags: { - requireBugValueZero: boolean; - requireMinimalEncoding: boolean; - requireNullSignatureFailures: boolean; - }; -}) => ({ - [OpcodesCommon.OP_RIPEMD160]: opRipemd160({ - ripemd160, - }), - [OpcodesCommon.OP_SHA1]: opSha1({ sha1 }), - [OpcodesCommon.OP_SHA256]: opSha256({ sha256 }), - [OpcodesCommon.OP_HASH160]: opHash160({ - ripemd160, - sha256, - }), - [OpcodesCommon.OP_HASH256]: opHash256({ sha256 }), - [OpcodesCommon.OP_CODESEPARATOR]: opCodeSeparator(), - [OpcodesCommon.OP_CHECKSIG]: opCheckSig({ - flags, - secp256k1, - sha256, - }), - [OpcodesCommon.OP_CHECKSIGVERIFY]: opCheckSigVerify({ - flags, + combineOperations(opCheckMultiSig({ secp256k1, sha256 }), opVerify); + +/** + * Validate the encoding of a raw signature – a signature without a signing + * serialization type byte (A.K.A. "sighash" byte). + * + * @param signature - the raw signature + */ +export const isValidSignatureEncodingBCHRaw = (signature: Uint8Array) => + signature.length === 0 || + signature.length === ConsensusCommon.schnorrSignatureLength || + isValidSignatureEncodingDER(signature); + +export const opCheckDataSig = + < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack + >({ secp256k1, sha256, - }), - [OpcodesCommon.OP_CHECKMULTISIG]: opCheckMultiSig({ - flags, + }: { + sha256: { hash: Sha256['hash'] }; + secp256k1: { + verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + }) => + (state: State) => + // eslint-disable-next-line complexity + useThreeStackItems(state, (nextState, [signature, message, publicKey]) => { + if (!isValidSignatureEncodingBCHRaw(signature)) { + return applyError( + nextState, + AuthenticationErrorCommon.invalidSignatureEncoding + ); + } + if (!isValidPublicKeyEncoding(publicKey)) { + return applyError( + nextState, + AuthenticationErrorCommon.invalidPublicKeyEncoding + ); + } + const digest = sha256.hash(message); + + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + nextState.signedMessages.push(message); + + const useSchnorr = + signature.length === ConsensusCommon.schnorrSignatureLength; + const success = useSchnorr + ? secp256k1.verifySignatureSchnorr(signature, publicKey, digest) + : secp256k1.verifySignatureDERLowS(signature, publicKey, digest); + + return !success && signature.length !== 0 + ? applyError( + nextState, + AuthenticationErrorCommon.nonNullSignatureFailure + ) + : pushToStack(nextState, booleanToVmNumber(success)); + }); + +export const opCheckDataSigVerify = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack +>( + { secp256k1, sha256, - }), - [OpcodesCommon.OP_CHECKMULTISIGVERIFY]: opCheckMultiSigVerify< - Opcodes, - State, - Errors - >({ flags, secp256k1, sha256 }), -}); + }: { + sha256: { hash: Sha256['hash'] }; + secp256k1: { + verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; + verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; + }; + } = { secp256k1: internalSecp256k1, sha256: internalSha256 } +) => combineOperations(opCheckDataSig({ secp256k1, sha256 }), opVerify); + +export const opReverseBytes = ( + state: State +) => + useOneStackItem(state, (nextState, [item]) => + pushToStack(nextState, item.slice().reverse()) + ); diff --git a/src/lib/vm/instruction-sets/common/encoding.ts b/src/lib/vm/instruction-sets/common/encoding.ts index 34c26f75..cccbfd60 100644 --- a/src/lib/vm/instruction-sets/common/encoding.ts +++ b/src/lib/vm/instruction-sets/common/encoding.ts @@ -1,72 +1,48 @@ -import { ConsensusBCH } from '../bch/bch'; - -import { isDefinedSigningSerializationType } from './signing-serialization'; - -const enum PublicKey { - uncompressedByteLength = 65, - uncompressedHeaderByte = 0x04, - compressedByteLength = 33, - compressedHeaderByteEven = 0x02, - compressedHeaderByteOdd = 0x03, -} - -export const isValidUncompressedPublicKeyEncoding = (publicKey: Uint8Array) => - publicKey.length === PublicKey.uncompressedByteLength && - publicKey[0] === PublicKey.uncompressedHeaderByte; - -export const isValidCompressedPublicKeyEncoding = (publicKey: Uint8Array) => - publicKey.length === PublicKey.compressedByteLength && - (publicKey[0] === PublicKey.compressedHeaderByteEven || - publicKey[0] === PublicKey.compressedHeaderByteOdd); - -export const isValidPublicKeyEncoding = (publicKey: Uint8Array) => - isValidCompressedPublicKeyEncoding(publicKey) || - isValidUncompressedPublicKeyEncoding(publicKey); +import { ConsensusCommon } from './consensus.js'; +import { isDefinedSigningSerializationType } from './signing-serialization.js'; const enum ASN1 { sequenceTagType = 0x30, integerTagType = 0x02, } +/* eslint-disable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ const enum DER { minimumLength = 8, maximumLength = 72, - sequenceTagIndex = 0, sequenceLengthIndex = 1, rTagIndex = 2, rLengthIndex = 3, rValueIndex = 4, - sequenceTagByte = 1, sequenceLengthByte = 1, integerTagByte = 1, integerLengthByte = 1, - // eslint-disable-next-line @typescript-eslint/restrict-plus-operands sequenceMetadataBytes = sequenceTagByte + sequenceLengthByte, - // eslint-disable-next-line @typescript-eslint/restrict-plus-operands integerMetadataBytes = integerTagByte + integerLengthByte, minimumSValueBytes = 1, - // eslint-disable-next-line @typescript-eslint/restrict-plus-operands minimumNonRValueBytes = sequenceMetadataBytes + integerMetadataBytes + integerMetadataBytes + minimumSValueBytes, } +/* eslint-enable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ const enum Mask { negative = 0x80, } -const isNegative = (value: number) => - // eslint-disable-next-line no-bitwise - (value & Mask.negative) !== 0; +const isNegative = (value: number | undefined) => + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + (value! & Mask.negative) !== 0; const hasUnnecessaryPadding = ( - length: number, - firstByte: number, - secondByte: number -) => length > 1 && firstByte === 0 && !isNegative(secondByte); + length: number | undefined, + firstByte: number | undefined, + secondByte: number | undefined + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion +) => length! > 1 && firstByte === 0 && !isNegative(secondByte); const isValidInteger = ( signature: Uint8Array, @@ -92,7 +68,7 @@ const isValidInteger = ( * specification in that it does not validate the existence of a signing * serialization type byte at the end of the signature (to support * OP_CHECKDATASIG). To validate a bitcoin-encoded signature (including null - * signatures), use `isValidSignatureEncodingBCH`. + * signatures), use {@link isValidSignatureEncodingBCHTransaction}. * * @privateRemarks * From the Bitcoin ABC C++ implementation: @@ -118,7 +94,7 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { const correctSequenceLength = signature[DER.sequenceLengthIndex] === signature.length - DER.sequenceMetadataBytes; - const rLength = signature[DER.rLengthIndex] as number | undefined; + const rLength = signature[DER.rLengthIndex]; if (rLength === undefined) { return false; } @@ -132,7 +108,7 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { ); const sTagIndex = DER.rValueIndex + rLength; // eslint-disable-line @typescript-eslint/restrict-plus-operands const sLengthIndex = sTagIndex + 1; - const sLength = signature[sLengthIndex] as number | undefined; + const sLength = signature[sLengthIndex]; if (sLength === undefined) { return false; } @@ -160,7 +136,7 @@ export const isValidSignatureEncodingBCHTransaction = ( transactionSignature: Uint8Array ) => transactionSignature.length === 0 || - transactionSignature.length === ConsensusBCH.schnorrSignatureLength + 1 || + transactionSignature.length === ConsensusCommon.schnorrSignatureLength + 1 || (isDefinedSigningSerializationType( transactionSignature[transactionSignature.length - 1] ) && @@ -177,11 +153,10 @@ export const isValidSignatureEncodingBCHTransaction = ( * serialization to provide replay-protection between different forks. (See * Bitcoin Cash's Replay Protected Sighash spec for details.) * - * @param signature - a signature which passes `isValidSignatureEncoding` + * @param encodedSignature - a signature that passes + * {@link isValidSignatureEncodingBCHTransaction} */ export const decodeBitcoinSignature = (encodedSignature: Uint8Array) => ({ - signature: encodedSignature.slice(0, encodedSignature.length - 1), - signingSerializationType: new Uint8Array([ - encodedSignature[encodedSignature.length - 1], - ]), + signature: encodedSignature.slice(0, -1), + signingSerializationType: encodedSignature.slice(-1), }); diff --git a/src/lib/vm/instruction-sets/common/errors.ts b/src/lib/vm/instruction-sets/common/errors.ts index 34011713..31be08d1 100644 --- a/src/lib/vm/instruction-sets/common/errors.ts +++ b/src/lib/vm/instruction-sets/common/errors.ts @@ -1,4 +1,4 @@ -import { AuthenticationProgramStateError } from '../../vm-types'; +import type { AuthenticationProgramStateError } from '../../../lib'; export enum AuthenticationErrorCommon { calledReserved = 'Program called an unassigned, reserved operation.', @@ -6,40 +6,51 @@ export enum AuthenticationErrorCommon { calledUpgradableNop = 'Program called a disallowed upgradable non-operation (OP_NOP1-OP_NOP10).', checkSequenceUnavailable = 'Program called an OP_CHECKSEQUENCEVERIFY operation, but OP_CHECKSEQUENCEVERIFY requires transaction version 2 or higher.', disabledOpcode = 'Program contains a disabled opcode.', + divisionByZero = 'Program attempted to divide a number by zero.', emptyAlternateStack = 'Tried to read from an empty alternate stack.', emptyStack = 'Tried to read from an empty stack.', exceededMaximumBytecodeLengthLocking = 'The provided locking bytecode exceeds the maximum bytecode length (10,000 bytes).', exceededMaximumBytecodeLengthUnlocking = 'The provided unlocking bytecode exceeds the maximum bytecode length (10,000 bytes).', + exceededMaximumVmNumberLength = 'Program attempted an OP_BIN2NUM operation on a byte sequence that cannot be encoded within the maximum VM Number length.', exceededMaximumStackDepth = 'Program exceeded the maximum stack depth (1,000 items).', + exceededMaximumStackItemLength = 'Program attempted to push a stack item that exceeded the maximum stack item length (520 bytes).', exceededMaximumOperationCount = 'Program exceeded the maximum operation count (201 operations).', - exceedsMaximumMultisigPublicKeyCount = 'Program called an OP_CHECKMULTISIG which exceeds the maximum public key count (20 public keys).', - exceedsMaximumPush = 'Push exceeds the push size limit of 520 bytes.', + exceedsMaximumMultisigPublicKeyCount = 'Program called an OP_CHECKMULTISIG that exceeds the maximum public key count (20 public keys).', failedVerify = 'Program failed an OP_VERIFY operation.', invalidStackIndex = 'Tried to read from an invalid stack index.', incompatibleLocktimeType = 'Program called an OP_CHECKLOCKTIMEVERIFY operation with an incompatible locktime type. The transaction locktime and required locktime must both refer to either a block height or a block time.', incompatibleSequenceType = 'Program called an OP_CHECKSEQUENCEVERIFY operation with an incompatible sequence type flag. The input sequence number and required sequence number must both use the same sequence locktime type.', - insufficientPublicKeys = 'Program called an OP_CHECKMULTISIG operation which requires signatures from more public keys than are provided.', + insufficientLength = 'Program called an OP_NUM2BIN operation with an insufficient byte length to re-encode the provided number.', + insufficientPublicKeys = 'Program called an OP_CHECKMULTISIG operation that requires signatures from more public keys than are provided.', invalidNaturalNumber = 'Invalid input: the key/signature count inputs for OP_CHECKMULTISIG require a natural number (n > 0).', - invalidProtocolBugValue = 'The OP_CHECKMULTISIG protocol bug value must be a Script Number 0 (to comply with the "NULLDUMMY" rule).', + invalidProtocolBugValue = 'The OP_CHECKMULTISIG protocol bug value must be a VM Number 0 (to comply with the "NULLDUMMY" rule).', invalidPublicKeyEncoding = 'Encountered an improperly encoded public key.', - invalidScriptNumber = 'Invalid input: this operation requires a valid Script Number.', + invalidVmNumber = 'Invalid input: this operation requires a valid VM Number.', invalidSignatureEncoding = 'Encountered an improperly encoded signature.', + invalidSplitIndex = 'Program called an OP_SPLIT operation with an invalid index.', + invalidTransactionInputIndex = 'Program attempted to read from an invalid transaction input index.', + invalidTransactionOutputIndex = 'Program attempted to read from an invalid transaction output index.', + invalidTransactionUtxoIndex = 'Program attempted to read from an invalid transaction UTXO index.', locktimeDisabled = 'Program called an OP_CHECKLOCKTIMEVERIFY operation, but locktime is disabled for this transaction.', + mismatchedBitwiseOperandLength = 'Program attempted a bitwise operation on operands of different lengths.', malformedLockingBytecode = 'The provided locking bytecode is malformed.', + malformedP2shBytecode = 'Redeem bytecode was malformed prior to P2SH evaluation.', malformedPush = 'Program must be long enough to push the requested number of bytes.', malformedUnlockingBytecode = 'The provided unlocking bytecode is malformed.', negativeLocktime = 'Program called an OP_CHECKLOCKTIMEVERIFY or OP_CHECKSEQUENCEVERIFY operation with a negative locktime.', - nonEmptyExecutionStack = 'Program completed with a non-empty execution stack (missing `OP_ENDIF`).', + nonEmptyControlStack = 'Program completed with a non-empty control stack (missing `OP_ENDIF`).', nonMinimalPush = 'Push operations must use the smallest possible encoding.', nonNullSignatureFailure = 'Program failed a signature verification with a non-null signature (violating the "NULLFAIL" rule).', + overflowsVmNumberRange = 'Program attempted an arithmetic operation which exceeds the range of VM Numbers.', requiresCleanStack = 'Program completed with an unexpected number of items on the stack (must be exactly 1).', + requiresPushOnly = 'Unlocking bytecode may contain only push operations.', schnorrSizedSignatureInCheckMultiSig = 'Program used a schnorr-sized signature (65 bytes) in an OP_CHECKMULTISIG operation.', unexpectedElse = 'Encountered an OP_ELSE outside of an OP_IF ... OP_ENDIF block.', - unexpectedEndIf = 'Encountered an OP_ENDIF which is not following a matching OP_IF.', + unexpectedEndIf = 'Encountered an OP_ENDIF that is not following a matching OP_IF.', unknownOpcode = 'Called an unknown opcode.', unmatchedSequenceDisable = "Program called an OP_CHECKSEQUENCEVERIFY operation requiring the disable flag, but the input's sequence number is missing the disable flag.", - unsatisfiedLocktime = "Program called an OP_CHECKLOCKTIMEVERIFY operation which requires a locktime greater than the transaction's locktime.", - unsatisfiedSequenceNumber = "Program called an OP_CHECKSEQUENCEVERIFY operation which requires a sequence number greater than the input's sequence number.", + unsatisfiedLocktime = "Program called an OP_CHECKLOCKTIMEVERIFY operation that requires a locktime greater than the transaction's locktime.", + unsatisfiedSequenceNumber = "Program called an OP_CHECKSEQUENCEVERIFY operation that requires a sequence number greater than the input's sequence number.", unsuccessfulEvaluation = 'Unsuccessful evaluation: completed with a non-truthy value on top of the stack.', } @@ -51,12 +62,9 @@ export enum AuthenticationErrorCommon { * (Evaluation should end after the first encountered error, so further errors * aren't relevant.) */ -export const applyError = < - State extends AuthenticationProgramStateError, - Errors ->( - error: AuthenticationErrorCommon | Errors, - state: State +export const applyError = ( + state: State, + error: string ): State => ({ ...state, error: state.error === undefined ? error : state.error, diff --git a/src/lib/vm/instruction-sets/common/flow-control.ts b/src/lib/vm/instruction-sets/common/flow-control.ts index ccd7225f..b6f249b5 100644 --- a/src/lib/vm/instruction-sets/common/flow-control.ts +++ b/src/lib/vm/instruction-sets/common/flow-control.ts @@ -1,139 +1,103 @@ -import { Operation } from '../../virtual-machine'; -import { - AuthenticationProgramStateCommon, +import type { + AuthenticationProgramStateControlStack, AuthenticationProgramStateError, - AuthenticationProgramStateExecutionStack, AuthenticationProgramStateStack, -} from '../../vm-types'; +} from '../../../lib'; -import { opNot } from './arithmetic'; -import { conditionallyEvaluate, useOneStackItem } from './combinators'; -import { stackItemIsTruthy } from './common'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { OpcodesCommon } from './opcodes'; +import { useOneStackItem } from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { stackItemIsTruthy } from './instruction-sets-utils.js'; export const opVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->(): Operation => (state: State) => + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => useOneStackItem(state, (nextState, [item]) => stackItemIsTruthy(item) ? nextState - : applyError( - AuthenticationErrorCommon.failedVerify, - nextState - ) + : applyError(nextState, AuthenticationErrorCommon.failedVerify) ); export const reservedOperation = < - State extends AuthenticationProgramStateError, - Errors ->() => (state: State) => - applyError(AuthenticationErrorCommon.calledReserved, state); + State extends AuthenticationProgramStateError +>( + state: State +) => applyError(state, AuthenticationErrorCommon.calledReserved); -export const opReturn = < - State extends AuthenticationProgramStateError, - Errors ->() => (state: State) => - applyError(AuthenticationErrorCommon.calledReturn, state); - -export const conditionalFlowControlOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->() => ({ - [OpcodesCommon.OP_RESERVED]: reservedOperation(), - [OpcodesCommon.OP_VER]: reservedOperation(), - [OpcodesCommon.OP_VERIFY]: opVerify(), - [OpcodesCommon.OP_RETURN]: opReturn(), - [OpcodesCommon.OP_RESERVED1]: reservedOperation(), - [OpcodesCommon.OP_RESERVED2]: reservedOperation(), -}); +export const opReturn = ( + state: State +) => applyError(state, AuthenticationErrorCommon.calledReturn); export const opIf = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - Errors ->(): Operation => (state: State) => { - if (state.executionStack.every((item) => item)) { - // eslint-disable-next-line functional/immutable-data - const element = state.stack.pop(); - if (element === undefined) { - return applyError( - AuthenticationErrorCommon.emptyStack, - state - ); - } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - state.executionStack.push(stackItemIsTruthy(element)); - return state; + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => { + if (state.controlStack.every((item) => item)) { + return useOneStackItem(state, (nextState, [item]) => { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + nextState.controlStack.push(stackItemIsTruthy(item)); + return state; + }); } // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - state.executionStack.push(false); + state.controlStack.push(false); return state; }; +/** + * Note, `OP_NOTIF` is not completely equivalent to `OP_NOT OP_IF`. `OP_NOT` + * operates on a VM Number (as the inverse of `OP_0NOTEQUAL`), while `OP_NOTIF` + * checks the "truthy-ness" of a stack item like `OP_IF`. + */ export const opNotIf = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}): Operation => { - const not = conditionallyEvaluate(opNot(flags)); - const ifOp = opIf(); - return (state: State) => ifOp(not(state)); + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => { + if (state.controlStack.every((item) => item)) { + return useOneStackItem(state, (nextState, [item]) => { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + nextState.controlStack.push(!stackItemIsTruthy(item)); + return state; + }); + } + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + state.controlStack.push(false); + return state; }; export const opEndIf = < - State extends AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - Errors ->(): Operation => (state: State) => { + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError +>( + state: State +) => { // eslint-disable-next-line functional/immutable-data - const element = state.executionStack.pop(); + const element = state.controlStack.pop(); if (element === undefined) { - return applyError( - AuthenticationErrorCommon.unexpectedEndIf, - state - ); + return applyError(state, AuthenticationErrorCommon.unexpectedEndIf); } return state; }; export const opElse = < - State extends AuthenticationProgramStateExecutionStack & - AuthenticationProgramStateError, - Errors ->(): Operation => (state: State) => { - const top = state.executionStack[state.executionStack.length - 1] as - | boolean - | undefined; + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError +>( + state: State +) => { + const top = state.controlStack[state.controlStack.length - 1]; if (top === undefined) { - return applyError( - AuthenticationErrorCommon.unexpectedElse, - state - ); + return applyError(state, AuthenticationErrorCommon.unexpectedElse); } // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - state.executionStack[state.executionStack.length - 1] = !top; + state.controlStack[state.controlStack.length - 1] = !top; return state; }; - -export const unconditionalFlowControlOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => ({ - [OpcodesCommon.OP_IF]: opIf(), - [OpcodesCommon.OP_NOTIF]: opNotIf(flags), - [OpcodesCommon.OP_VERIF]: reservedOperation(), - [OpcodesCommon.OP_VERNOTIF]: reservedOperation(), - [OpcodesCommon.OP_ELSE]: opElse(), - [OpcodesCommon.OP_ENDIF]: opEndIf(), -}); diff --git a/src/lib/vm/instruction-sets/common/format.ts b/src/lib/vm/instruction-sets/common/format.ts new file mode 100644 index 00000000..393aba59 --- /dev/null +++ b/src/lib/vm/instruction-sets/common/format.ts @@ -0,0 +1,136 @@ +import { flattenBinArray } from '../../../format/format.js'; +import type { + AuthenticationProgramStateError, + AuthenticationProgramStateStack, +} from '../../../lib'; + +import { + pushToStack, + pushToStackChecked, + useOneStackItem, + useOneVmNumber, + useTwoStackItems, +} from './combinators.js'; +import { ConsensusCommon } from './consensus.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { bigIntToVmNumber } from './instruction-sets-utils.js'; + +export const opCat = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useTwoStackItems(state, (nextState, [a, b]) => + pushToStackChecked(nextState, flattenBinArray([a, b])) + ); + +export const opSplit = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, value) => { + const index = Number(value); + return useOneStackItem(nextState, (finalState, [item]) => + index < 0 || index > item.length + ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) + : pushToStack(finalState, item.slice(0, index), item.slice(index)) + ); + }); + +const enum Constants { + positiveSign = 0x00, + negativeSign = 0x80, +} + +/** + * Pad a minimally-encoded VM number for `OP_NUM2BIN`. + */ +export const padMinimallyEncodedVmNumber = ( + vmNumber: Uint8Array, + length: number +) => { + // eslint-disable-next-line functional/no-let + let signBit = Constants.positiveSign; + // eslint-disable-next-line functional/no-conditional-statement + if (vmNumber.length > 0) { + // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + signBit = vmNumber[vmNumber.length - 1]! & Constants.negativeSign; + // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + vmNumber[vmNumber.length - 1] &= Constants.negativeSign - 1; + } + const result = Array.from(vmNumber); + // eslint-disable-next-line functional/no-loop-statement + while (result.length < length - 1) { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + result.push(0); + } + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + result.push(signBit); + return Uint8Array.from(result); +}; + +export const opNum2Bin = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, value) => { + const targetLength = Number(value); + return targetLength > ConsensusCommon.maximumStackItemLength + ? applyError( + nextState, + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${targetLength} bytes.` + ) + : useOneVmNumber( + nextState, + (finalState, [target]) => { + const minimallyEncoded = bigIntToVmNumber(target); + return minimallyEncoded.length > targetLength + ? applyError( + finalState, + AuthenticationErrorCommon.insufficientLength + ) + : minimallyEncoded.length === targetLength + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) + ); + }, + { + maximumVmNumberByteLength: + // TODO: is this right? + ConsensusCommon.maximumStackItemLength as number, + requireMinimalEncoding: false, + } + ); + }); + +export const opBin2Num = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber( + state, + (nextState, [target]) => { + const minimallyEncoded = bigIntToVmNumber(target); + return minimallyEncoded.length > ConsensusCommon.maximumVmNumberLength + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumVmNumberLength + ) + : pushToStack(nextState, minimallyEncoded); + }, + { + // TODO: is this right? + maximumVmNumberByteLength: + ConsensusCommon.maximumStackItemLength as number, + requireMinimalEncoding: false, + } + ); diff --git a/src/lib/vm/instruction-sets/common/inspection.ts b/src/lib/vm/instruction-sets/common/inspection.ts new file mode 100644 index 00000000..9cf1f759 --- /dev/null +++ b/src/lib/vm/instruction-sets/common/inspection.ts @@ -0,0 +1,175 @@ +import { binToBigIntUint64LE } from '../../../format/format.js'; +import type { + AuthenticationProgramStateCommon, + Input, + Output, +} from '../../../lib'; + +import { + pushToStackChecked, + pushToStackVmNumberChecked, + useOneVmNumber, +} from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { encodeAuthenticationInstructions } from './instruction-sets-utils.js'; + +export const opInputIndex = ( + state: State +) => pushToStackVmNumberChecked(state, BigInt(state.program.inputIndex)); + +export const opActiveBytecode = < + State extends AuthenticationProgramStateCommon +>( + state: State +) => + pushToStackChecked( + state, + encodeAuthenticationInstructions( + state.instructions.slice(state.lastCodeSeparator + 1) + ) + ); + +export const opTxVersion = ( + state: State +) => + pushToStackVmNumberChecked(state, BigInt(state.program.transaction.version)); + +export const opTxInputCount = ( + state: State +) => + pushToStackVmNumberChecked( + state, + BigInt(state.program.transaction.inputs.length) + ); + +export const opTxOutputCount = ( + state: State +) => + pushToStackVmNumberChecked( + state, + BigInt(state.program.transaction.outputs.length) + ); + +export const opTxLocktime = ( + state: State +) => + pushToStackVmNumberChecked(state, BigInt(state.program.transaction.locktime)); + +export const useTransactionUtxo = < + State extends AuthenticationProgramStateCommon +>( + state: State, + operation: (nextState: State, [utxo]: [Output]) => State +) => + useOneVmNumber(state, (nextState, [index]) => { + const utxo = nextState.program.sourceOutputs[Number(index)]; + if (utxo === undefined) { + return applyError( + nextState, + AuthenticationErrorCommon.invalidTransactionUtxoIndex + ); + } + return operation(state, [utxo]); + }); + +export const opUtxoValue = ( + state: State +) => + useTransactionUtxo(state, (nextState, [utxo]) => + pushToStackVmNumberChecked( + nextState, + binToBigIntUint64LE(utxo.valueSatoshis) + ) + ); + +export const opUtxoBytecode = ( + state: State +) => + useTransactionUtxo(state, (nextState, [utxo]) => + pushToStackChecked(nextState, utxo.lockingBytecode.slice()) + ); + +export const useTransactionInput = < + State extends AuthenticationProgramStateCommon +>( + state: State, + operation: (nextState: State, [input]: [Input]) => State +) => + useOneVmNumber(state, (nextState, [index]) => { + const input = nextState.program.transaction.inputs[Number(index)]; + if (input === undefined) { + return applyError( + nextState, + AuthenticationErrorCommon.invalidTransactionInputIndex + ); + } + return operation(state, [input]); + }); + +export const opOutpointTxHash = < + State extends AuthenticationProgramStateCommon +>( + state: State +) => + useTransactionInput(state, (nextState, [input]) => + pushToStackChecked(nextState, input.outpointTransactionHash.slice()) + ); + +export const opOutpointIndex = ( + state: State +) => + useTransactionInput(state, (nextState, [input]) => + pushToStackVmNumberChecked(nextState, BigInt(input.outpointIndex)) + ); + +export const opInputBytecode = ( + state: State +) => + useTransactionInput(state, (nextState, [input]) => + pushToStackChecked(nextState, input.unlockingBytecode.slice()) + ); + +export const opInputSequenceNumber = < + State extends AuthenticationProgramStateCommon +>( + state: State +) => + useTransactionInput(state, (nextState, [input]) => + pushToStackVmNumberChecked(nextState, BigInt(input.sequenceNumber)) + ); + +export const useTransactionOutput = < + State extends AuthenticationProgramStateCommon +>( + state: State, + operation: (nextState: State, [output]: [Output]) => State +) => + useOneVmNumber(state, (nextState, [index]) => { + const input = nextState.program.transaction.outputs[Number(index)]; + if (input === undefined) { + return applyError( + nextState, + AuthenticationErrorCommon.invalidTransactionOutputIndex + ); + } + return operation(state, [input]); + }); + +export const opOutputValue = ( + state: State +) => + useTransactionOutput(state, (nextState, [output]) => + pushToStackVmNumberChecked( + nextState, + binToBigIntUint64LE(output.valueSatoshis) + ) + ); + +export const opOutputBytecode = < + State extends AuthenticationProgramStateCommon +>( + state: State +) => + useTransactionOutput(state, (nextState, [output]) => + pushToStackChecked(nextState, output.lockingBytecode.slice()) + ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-types.ts b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts new file mode 100644 index 00000000..10922ed0 --- /dev/null +++ b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts @@ -0,0 +1,113 @@ +/** + * A well-formed "push" authentication instruction (`OP_PUSHBYTES*` or + * `OP_PUSHDATA*`). + */ +export interface AuthenticationInstructionPush { + /** + * The data to be pushed to the stack. + */ + readonly data: Uint8Array; + /** + * The opcode used to push this data. + */ + readonly opcode: number; +} + +/** + * An authentication instruction indicating an operation (as opposed to a + * {@link AuthenticationInstructionPush}). + */ +export interface AuthenticationInstructionOperation { + /** + * The opcode of this instruction's operation. + */ + readonly opcode: number; +} + +/** + * A well-formed instruction used by an {@link AuthenticationVirtualMachine}. + */ +export type AuthenticationInstruction = + | AuthenticationInstructionOperation + | AuthenticationInstructionPush; + +/** + * An array of {@link AuthenticationInstruction}s. + */ +export type AuthenticationInstructions = AuthenticationInstruction[]; + +type Uint8Bytes = 1; +type Uint16Bytes = 2; +type Uint32Bytes = 4; + +/** + * A malformed `OP_PUSHDATA*` authentication instruction in which the length + * byte is incomplete (the bytecode ends before enough bytes can be read). + */ +export interface AuthenticationInstructionPushMalformedLength { + /** + * The expected number of length bytes (`length.length`) for this + * `OP_PUSHDATA*` operation. + */ + readonly expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; + /** + * The length `Uint8Array` provided. This instruction is malformed because the + * length of this `Uint8Array` is shorter than the `expectedLengthBytes`. + */ + readonly length: Uint8Array; + readonly malformed: true; + readonly opcode: number; +} + +/** + * A malformed "push" authentication instruction in which the pushed data is + * incomplete (the bytecode ends before enough bytes can be read). + */ +export interface AuthenticationInstructionPushMalformedData { + /** + * The data `Uint8Array` provided. This instruction is malformed because the + * length of this `Uint8Array` is shorter than the `expectedDataBytes`. + */ + readonly data: Uint8Array; + /** + * The expected number of `data` bytes for this push operation. + */ + readonly expectedDataBytes: number; + readonly malformed: true; + readonly opcode: number; +} + +/** + * A malformed authentication instruction (the bytecode ends before enough bytes + * can be read). + */ +export type AuthenticationInstructionMalformed = + | AuthenticationInstructionPushMalformedData + | AuthenticationInstructionPushMalformedLength; + +/** + * A potentially-malformed {@link AuthenticationInstruction}. If `malformed` is + * `true`, this could be either + * {@link AuthenticationInstructionPushMalformedLength} or + * {@link AuthenticationInstructionPushMalformedData}. + * + * If the final instruction is a push operation that requires more bytes than + * are available in the remaining bytecode, that instruction will have a + * `malformed` property with a value of `true`. + */ +export type AuthenticationInstructionMaybeMalformed = + | AuthenticationInstruction + | AuthenticationInstructionMalformed; + +export type AuthenticationInstructionsMalformed = [ + ...AuthenticationInstruction[], + AuthenticationInstructionMalformed +]; + +/** + * An array of authentication instructions that may end with a malformed + * instruction. + */ +export type AuthenticationInstructionsMaybeMalformed = + | AuthenticationInstructions + | AuthenticationInstructionsMalformed; diff --git a/src/lib/vm/instruction-sets/instruction-sets-utils.spec.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts similarity index 67% rename from src/lib/vm/instruction-sets/instruction-sets-utils.spec.ts rename to src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts index 608de273..71669755 100644 --- a/src/lib/vm/instruction-sets/instruction-sets-utils.spec.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts @@ -1,29 +1,30 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/immutable-data */ -import test, { Macro } from 'ava'; +import test from 'ava'; import { fc, testProp } from 'ava-fast-check'; +import type { + AuthenticationInstruction, + AuthenticationInstructionPush, + AuthenticationInstructionsMaybeMalformed, +} from '../../../lib'; import { assembleBytecode, assembleBytecodeBCH, assembleBytecodeBTC, - AuthenticationInstruction, - AuthenticationInstructionPush, authenticationInstructionsAreMalformed, + decodeAuthenticationInstructions, + disassembleAuthenticationInstructionsMaybeMalformed, disassembleBytecode, disassembleBytecodeBCH, disassembleBytecodeBTC, - disassembleParsedAuthenticationInstructions, + encodeAuthenticationInstruction, + encodeAuthenticationInstructions, + encodeAuthenticationInstructionsMaybeMalformed, generateBytecodeMap, hexToBin, - OpcodesBCH, + OpcodesBCH2022, OpcodesBTC, - parseBytecode, - ParsedAuthenticationInstruction, range, - serializeAuthenticationInstruction, - serializeAuthenticationInstructions, - serializeParsedAuthenticationInstructions, -} from '../../lib'; +} from '../../../lib.js'; test('Each Opcodes enum contains a single instruction for 0-255', (t) => { const expected = range(256); @@ -32,7 +33,7 @@ test('Each Opcodes enum contains a single instruction for 0-255', (t) => { const numbers = (keys: readonly string[]) => keys.map((k) => parseInt(k, 10)).filter((k) => !isNaN(k)); - const bch = Object.keys(OpcodesBCH); + const bch = Object.keys(OpcodesBCH2022); t.deepEqual(numbers(bch), expected); t.deepEqual(names(bch).length, expected.length); @@ -52,17 +53,23 @@ test('Each Opcodes enum contains a single instruction for 0-255', (t) => { * - element 3 – `length`, hex-encoded (if present) * - element 4 – `expectedLengthBytes`, hex-encoded (if present) */ -interface CommonScriptParseAndAsmTests { - readonly [scriptHex: string]: { +type CommonScriptParseAndAsmTests = Readonly<{ + [scriptHex: string]: { readonly asm: string; - readonly parse: [number, string?, number?, string?, number?][]; + readonly parse: ( + | [number, string, number, string, number] + | [number, string, number] + | [number, string] + | [number, undefined, undefined, string, number] + | [number] + )[]; }; -} +}>; const defToFixtures = (tests: CommonScriptParseAndAsmTests) => Object.entries(tests).map((entry) => { const [fullHex, { asm }] = entry; - const [, hex] = fullHex.split('0x'); + const hex = fullHex.replace('0x', ''); const script = hexToBin(hex); // eslint-disable-next-line complexity const object = entry[1].parse.map((set) => ({ @@ -72,7 +79,7 @@ const defToFixtures = (tests: CommonScriptParseAndAsmTests) => ...(set[2] === undefined ? undefined : { expectedDataBytes: set[2] }), ...(set[3] === undefined ? undefined : { length: hexToBin(set[3]) }), ...(set[4] === undefined ? undefined : { expectedLengthBytes: set[4] }), - })); + })) as AuthenticationInstructionsMaybeMalformed; return { asm, hex, object, script }; }); @@ -82,28 +89,26 @@ const wellFormedScripts: CommonScriptParseAndAsmTests = { parse: [[0, '']], }, '0x0001010202020303030376': { - asm: - 'OP_0 OP_PUSHBYTES_1 0x01 OP_PUSHBYTES_2 0x0202 OP_PUSHBYTES_3 0x030303 OP_DUP', + asm: 'OP_0 OP_PUSHBYTES_1 0x01 OP_PUSHBYTES_2 0x0202 OP_PUSHBYTES_3 0x030303 OP_DUP', parse: [[0, ''], [1, '01'], [2, '0202'], [3, '030303'], [118]], }, - '0x410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac': { - asm: - 'OP_PUSHBYTES_65 0x0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG', - parse: [ - [ - 0x41, - '0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3', + '0x410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac': + { + asm: 'OP_PUSHBYTES_65 0x0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG', + parse: [ + [ + 0x41, + '0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3', + ], + [0xac], ], - [0xac], - ], - }, + }, '0x4c020304': { asm: 'OP_PUSHDATA_1 2 0x0304', parse: [[0x4c, '0304']], }, '0x76a91411b366edfc0a8b66feebae5c2e25a7b6a5d1cf3188ac': { - asm: - 'OP_DUP OP_HASH160 OP_PUSHBYTES_20 0x11b366edfc0a8b66feebae5c2e25a7b6a5d1cf31 OP_EQUALVERIFY OP_CHECKSIG', + asm: 'OP_DUP OP_HASH160 OP_PUSHBYTES_20 0x11b366edfc0a8b66feebae5c2e25a7b6a5d1cf31 OP_EQUALVERIFY OP_CHECKSIG', parse: [ [0x76], [0xa9], @@ -169,56 +174,61 @@ const malFormedPushes: CommonScriptParseAndAsmTests = { }, }; -const parse: Macro<[Uint8Array, readonly ParsedAuthenticationInstruction[]]> = ( - t, - input, - expected -) => { - t.deepEqual(parseBytecode(input), expected); -}; -parse.title = (title) => `parse script: ${title ?? ''}`.trim(); +const parse = test.macro< + [Uint8Array, AuthenticationInstructionsMaybeMalformed] +>({ + exec: (t, input, expected) => { + t.deepEqual(decodeAuthenticationInstructions(input), expected); + }, + title: (title) => `parse script: ${title ?? ''}`.trim(), +}); -const disassemble: Macro<[ - readonly ParsedAuthenticationInstruction[], - string -]> = (t, input, expected) => { - t.deepEqual( - disassembleParsedAuthenticationInstructions(OpcodesBCH, input), - expected - ); -}; -disassemble.title = (title) => `disassemble script: ${title ?? ''}`.trim(); +const disassemble = test.macro< + [AuthenticationInstructionsMaybeMalformed, string] +>({ + exec: (t, input, expected) => { + t.deepEqual( + disassembleAuthenticationInstructionsMaybeMalformed( + OpcodesBCH2022, + input + ), + expected + ); + }, + title: (title) => `disassemble script: ${title ?? ''}`.trim(), +}); -const serialize: Macro<[readonly AuthenticationInstruction[], Uint8Array]> = ( - t, - input, - expected -) => { - t.deepEqual(serializeAuthenticationInstructions(input), expected); -}; -serialize.title = (title) => `serialize script: ${title ?? ''}`.trim(); +const encode = test.macro<[readonly AuthenticationInstruction[], Uint8Array]>({ + exec: (t, input, expected) => { + t.deepEqual(encodeAuthenticationInstructions(input), expected); + }, + title: (title) => `encode script: ${title ?? ''}`.trim(), +}); -const reSerialize: Macro<[ - readonly ParsedAuthenticationInstruction[], - Uint8Array -]> = (t, input, expected) => { - t.deepEqual(serializeParsedAuthenticationInstructions(input), expected); -}; -reSerialize.title = (title) => - `re-serialize parsed script: ${title ?? ''}`.trim(); +const reEncode = test.macro< + [AuthenticationInstructionsMaybeMalformed, Uint8Array] +>({ + exec: (t, input, expected) => { + t.deepEqual( + encodeAuthenticationInstructionsMaybeMalformed(input), + expected + ); + }, + title: (title) => `re-encode parsed script: ${title ?? ''}`.trim(), +}); defToFixtures(wellFormedScripts).map(({ asm, hex, script, object }) => { test(`0x${hex}`, parse, script, object); test(`0x${hex}`, disassemble, object, asm); - test(`0x${hex}`, serialize, object, script); - test(`0x${hex}`, reSerialize, object, script); + test(`0x${hex}`, encode, object, script); + test(`0x${hex}`, reEncode, object, script); return undefined; }); defToFixtures(malFormedPushes).map(({ asm, hex, script, object }) => { test(`0x${hex}`, parse, script, object); test(`0x${hex}`, disassemble, object, asm); - test(`0x${hex}`, reSerialize, object, script); + test(`0x${hex}`, reEncode, object, script); return undefined; }); @@ -229,39 +239,39 @@ test('generateBytecodeMap', (t) => { OP_C = 3, } t.deepEqual(generateBytecodeMap(TestOpcodes), { - OP_A: Uint8Array.of(1), // eslint-disable-line @typescript-eslint/naming-convention - OP_B: Uint8Array.of(2), // eslint-disable-line @typescript-eslint/naming-convention - OP_C: Uint8Array.of(3), // eslint-disable-line @typescript-eslint/naming-convention + OP_A: Uint8Array.of(1), + OP_B: Uint8Array.of(2), + OP_C: Uint8Array.of(3), }); }); -test('serializeAuthenticationInstruction', (t) => { +test('encodeAuthenticationInstruction', (t) => { const OP_PUSHDATA_1 = 0x4c; const pushData1Expected = new Uint8Array(102); pushData1Expected.set([OP_PUSHDATA_1, 100]); - const pushData1Serialized = serializeAuthenticationInstruction({ + const pushData1Encoded = encodeAuthenticationInstruction({ data: new Uint8Array(100), opcode: OP_PUSHDATA_1, }); - t.deepEqual(pushData1Serialized, pushData1Expected); + t.deepEqual(pushData1Encoded, pushData1Expected); const OP_PUSHDATA_2 = 0x4d; const pushData2Expected = new Uint8Array(259); pushData2Expected.set([OP_PUSHDATA_2, 0, 1]); - const pushData2Serialized = serializeAuthenticationInstruction({ + const pushData2Encoded = encodeAuthenticationInstruction({ data: new Uint8Array(256), opcode: OP_PUSHDATA_2, }); - t.deepEqual(pushData2Serialized, pushData2Expected); + t.deepEqual(pushData2Encoded, pushData2Expected); const OP_PUSHDATA_4 = 0x4e; const pushData4Expected = new Uint8Array(65541); pushData4Expected.set([OP_PUSHDATA_4, 0, 0, 1, 0]); - const pushData4Serialized = serializeAuthenticationInstruction({ + const pushData4Encoded = encodeAuthenticationInstruction({ data: new Uint8Array(65536), opcode: OP_PUSHDATA_4, }); - t.deepEqual(pushData4Serialized, pushData4Expected); + t.deepEqual(pushData4Encoded, pushData4Expected); }); enum TestOpcodes { @@ -324,32 +334,34 @@ testProp( '[fast-check] disassembleBytecodeBCH <-> assembleBytecodeBCH', [fcUint8Array(0, maxBinLength)], (t, randomBytecode: Uint8Array) => { - const parsed = parseBytecode(randomBytecode); - const instructions = (authenticationInstructionsAreMalformed(parsed) - ? parsed.slice(0, -1) - : parsed) as AuthenticationInstruction[]; + const parsed = decodeAuthenticationInstructions(randomBytecode); + const instructions = ( + authenticationInstructionsAreMalformed(parsed) + ? parsed.slice(0, -1) + : parsed + ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => - [OpcodesBCH.OP_PUSHDATA_2, OpcodesBCH.OP_PUSHDATA_4].includes( + [OpcodesBCH2022.OP_PUSHDATA_2, OpcodesBCH2022.OP_PUSHDATA_4].includes( instruction.opcode ) - ? { opcode: OpcodesBCH.OP_1 } - : instruction.opcode === OpcodesBCH.OP_PUSHDATA_1 && + ? { opcode: OpcodesBCH2022.OP_1 } + : instruction.opcode === OpcodesBCH2022.OP_PUSHDATA_1 && (instruction as AuthenticationInstructionPush).data.length < 76 ? { data: new Uint8Array(76), - opcode: OpcodesBCH.OP_PUSHDATA_1, + opcode: OpcodesBCH2022.OP_PUSHDATA_1, } : instruction ); - const serialized = serializeAuthenticationInstructions(minimalPush); + const encoded = encodeAuthenticationInstructions(minimalPush); - const disassembled = disassembleBytecodeBCH(serialized); + const disassembled = disassembleBytecodeBCH(encoded); const reassembled = assembleBytecodeBCH(disassembled); if (!reassembled.success) { t.fail(); return; } - t.deepEqual(serialized, reassembled.bytecode); + t.deepEqual(encoded, reassembled.bytecode); } ); @@ -357,10 +369,12 @@ testProp( '[fast-check] disassembleBytecodeBTC <-> assembleBytecodeBTC', [fcUint8Array(0, maxBinLength)], (t, randomBytecode: Uint8Array) => { - const parsed = parseBytecode(randomBytecode); - const instructions = (authenticationInstructionsAreMalformed(parsed) - ? parsed.slice(0, -1) - : parsed) as AuthenticationInstruction[]; + const parsed = decodeAuthenticationInstructions(randomBytecode); + const instructions = ( + authenticationInstructionsAreMalformed(parsed) + ? parsed.slice(0, -1) + : parsed + ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => [OpcodesBTC.OP_PUSHDATA_2, OpcodesBTC.OP_PUSHDATA_4].includes( instruction.opcode @@ -374,14 +388,14 @@ testProp( } : instruction ); - const serialized = serializeAuthenticationInstructions(minimalPush); + const encoded = encodeAuthenticationInstructions(minimalPush); - const disassembled = disassembleBytecodeBTC(serialized); + const disassembled = disassembleBytecodeBTC(encoded); const reassembled = assembleBytecodeBTC(disassembled); if (!reassembled.success) { t.fail(); return; } - t.deepEqual(serialized, reassembled.bytecode); + t.deepEqual(encoded, reassembled.bytecode); } ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts new file mode 100644 index 00000000..e609248b --- /dev/null +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts @@ -0,0 +1,819 @@ +import { + isPayToPublicKey, + isPayToPublicKeyHash, + isPayToScriptHash20, +} from '../../../address/address.js'; +import { + binToHex, + flattenBinArray, + numberToBinUint16LE, + numberToBinUint32LE, +} from '../../../format/format.js'; +import type { + AuthenticationInstruction, + AuthenticationInstructionMalformed, + AuthenticationInstructionMaybeMalformed, + AuthenticationInstructionPush, + AuthenticationInstructionPushMalformedLength, + AuthenticationInstructions, + AuthenticationInstructionsMalformed, + AuthenticationInstructionsMaybeMalformed, +} from '../../../lib'; +import { OpcodesBCH } from '../bch/2022/bch-2022-opcodes.js'; +import { OpcodesBTC } from '../btc/btc-opcodes.js'; + +/** + * A type-guard that checks if the provided instruction is malformed. + * @param instruction - the instruction to check + */ +export const authenticationInstructionIsMalformed = ( + instruction: AuthenticationInstructionMaybeMalformed +): instruction is AuthenticationInstructionMalformed => + 'malformed' in instruction; + +/** + * A type-guard that checks if the final instruction in the provided array of + * instructions is malformed. (Only the final instruction can be malformed.) + * @param instructions - the array of instructions to check + */ +export const authenticationInstructionsAreMalformed = ( + instructions: AuthenticationInstructionsMaybeMalformed +): instructions is AuthenticationInstructionsMalformed => + instructions.length > 0 && + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + authenticationInstructionIsMalformed(instructions[instructions.length - 1]!); + +export const authenticationInstructionsArePushInstructions = ( + instructions: AuthenticationInstructions +): instructions is AuthenticationInstructionPush[] => + instructions.every((instruction) => 'data' in instruction); + +const enum CommonPushOpcodes { + OP_0 = 0x00, + OP_PUSHDATA_1 = 0x4c, + OP_PUSHDATA_2 = 0x4d, + OP_PUSHDATA_4 = 0x4e, +} + +const uint8Bytes = 1; +const uint16Bytes = 2; +const uint32Bytes = 4; + +/** + * Decode a little endian number of `length` from virtual machine `bytecode` + * beginning at `index`. + */ +export const decodeLittleEndianNumber = ( + bytecode: Uint8Array, + index: number, + length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes +) => { + const view = new DataView(bytecode.buffer, index, length); + const readAsLittleEndian = true; + return length === uint8Bytes + ? view.getUint8(0) + : length === uint16Bytes + ? view.getUint16(0, readAsLittleEndian) + : view.getUint32(0, readAsLittleEndian); +}; + +/** + * Returns the number of bytes used to indicate the length of the push in this + * operation. + * @param opcode - an opcode between 0x00 and 0xff + */ +export const opcodeToPushLength = ( + opcode: number +): typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes | 0 => + ({ + [CommonPushOpcodes.OP_PUSHDATA_1]: uint8Bytes as typeof uint8Bytes, + [CommonPushOpcodes.OP_PUSHDATA_2]: uint16Bytes as typeof uint16Bytes, + [CommonPushOpcodes.OP_PUSHDATA_4]: uint32Bytes as typeof uint32Bytes, + }[opcode] ?? 0); + +/** + * Decode one instruction from the provided virtual machine bytecode. + * + * Returns an object with an `instruction` referencing a + * {@link AuthenticationInstructionMaybeMalformed}, and a `nextIndex` indicating + * the next index from which to read. If the next index is greater than or equal + * to the length of the bytecode, the bytecode has been fully decoded. + * + * The final {@link AuthenticationInstructionMaybeMalformed} in the bytecode may + * be malformed if 1) the final operation is a push and 2) too few bytes remain + * for the push operation to complete. + * + * @param bytecode - the virtual machine bytecode from which to read the next + * instruction + * @param index - the index from which to begin reading + */ +// eslint-disable-next-line complexity +export const decodeAuthenticationInstruction = ( + bytecode: Uint8Array, + index: number +): { + instruction: AuthenticationInstructionMaybeMalformed; + nextIndex: number; +} => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const opcode = bytecode[index]!; + if (opcode > CommonPushOpcodes.OP_PUSHDATA_4) { + return { + instruction: { + opcode, + }, + nextIndex: index + 1, + }; + } + const lengthBytes = opcodeToPushLength(opcode); + + if (lengthBytes !== 0 && index + lengthBytes >= bytecode.length) { + const sliceStart = index + 1; + const sliceEnd = sliceStart + lengthBytes; + return { + instruction: { + expectedLengthBytes: lengthBytes, + length: bytecode.slice(sliceStart, sliceEnd), + malformed: true, + opcode, + }, + nextIndex: sliceEnd, + }; + } + + const dataBytes = + lengthBytes === 0 + ? opcode + : decodeLittleEndianNumber(bytecode, index + 1, lengthBytes); + const dataStart = index + 1 + lengthBytes; + const dataEnd = dataStart + dataBytes; + return { + instruction: { + data: bytecode.slice(dataStart, dataEnd), + ...(dataEnd > bytecode.length + ? { + expectedDataBytes: dataEnd - dataStart, + malformed: true, + } + : undefined), + opcode, + }, + nextIndex: dataEnd, + }; +}; + +/** + * @param instruction - the {@link AuthenticationInstruction} to clone. + * @returns A copy of the provided {@link AuthenticationInstruction}. + */ +export const cloneAuthenticationInstruction = ( + instruction: Readonly +): AuthenticationInstruction => ({ + ...('data' in instruction ? { data: instruction.data } : {}), + opcode: instruction.opcode, +}); + +/** + * Decode authentication virtual machine bytecode (`lockingBytecode` or + * `unlockingBytecode`) into {@link AuthenticationInstructionsMaybeMalformed}. + * The method {@link authenticationInstructionsAreMalformed} can be used to + * check if these instructions include a malformed instruction. If not, they are + * valid {@link AuthenticationInstructions}. + * + * @param bytecode - the authentication virtual machine bytecode to decode + */ +export const decodeAuthenticationInstructions = (bytecode: Uint8Array) => { + const instructions = [] as AuthenticationInstructionsMaybeMalformed; + // eslint-disable-next-line functional/no-let + let i = 0; + // eslint-disable-next-line functional/no-loop-statement + while (i < bytecode.length) { + const { instruction, nextIndex } = decodeAuthenticationInstruction( + bytecode, + i + ); + // eslint-disable-next-line functional/no-expression-statement + i = nextIndex; + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + (instructions as AuthenticationInstruction[]).push( + instruction as AuthenticationInstruction + ); + } + return instructions; +}; + +/** + * OP_0 is the only single-word push. All other push instructions will + * disassemble to multiple ASM words. (OP_1-OP_16 are handled like normal + * operations.) + */ +const isMultiWordPush = (opcode: number) => opcode !== CommonPushOpcodes.OP_0; +const formatAsmPushHex = (data: Uint8Array) => + data.length > 0 ? `0x${binToHex(data)}` : ''; +const formatMissingBytesAsm = (missing: number) => + `[missing ${missing} byte${missing === 1 ? '' : 's'}]`; +const hasMalformedLength = ( + instruction: AuthenticationInstructionMalformed +): instruction is AuthenticationInstructionPushMalformedLength => + 'length' in instruction; +const isPushData = (pushOpcode: number) => + pushOpcode >= CommonPushOpcodes.OP_PUSHDATA_1; + +/** + * Disassemble a malformed authentication instruction into a string description. + * @param opcodes - a mapping of possible opcodes to their string representation + * @param instruction - the {@link AuthenticationInstructionMalformed} to + * disassemble + */ +export const disassembleAuthenticationInstructionMalformed = ( + opcodes: Readonly<{ [opcode: number]: string }>, + instruction: AuthenticationInstructionMalformed +): string => + `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'} ${ + hasMalformedLength(instruction) + ? `${formatAsmPushHex(instruction.length)}${formatMissingBytesAsm( + instruction.expectedLengthBytes - instruction.length.length + )}` + : `${ + isPushData(instruction.opcode) + ? `${instruction.expectedDataBytes} ` + : '' + }${formatAsmPushHex(instruction.data)}${formatMissingBytesAsm( + instruction.expectedDataBytes - instruction.data.length + )}` + }`; + +/** + * Disassemble a properly-formed authentication instruction into a string + * description. + * @param opcodes - a mapping of possible opcodes to their string representation + * @param instruction - the instruction to disassemble + */ +export const disassembleAuthenticationInstruction = ( + opcodes: Readonly<{ [opcode: number]: string }>, + instruction: AuthenticationInstruction +): string => + `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'}${ + 'data' in instruction && isMultiWordPush(instruction.opcode) + ? ` ${ + isPushData(instruction.opcode) ? `${instruction.data.length} ` : '' + }${formatAsmPushHex(instruction.data)}` + : '' + }`; + +/** + * Disassemble a single {@link AuthenticationInstructionMaybeMalformed} into its + * ASM representation. + * + * @param opcodes - a mapping of possible opcodes to their string representation + * @param instruction - the instruction to disassemble + */ +export const disassembleAuthenticationInstructionMaybeMalformed = ( + opcodes: Readonly<{ [opcode: number]: string }>, + instruction: AuthenticationInstructionMaybeMalformed +): string => + authenticationInstructionIsMalformed(instruction) + ? disassembleAuthenticationInstructionMalformed(opcodes, instruction) + : disassembleAuthenticationInstruction(opcodes, instruction); + +/** + * Disassemble an array of {@link AuthenticationInstructionMaybeMalformed} + * (including potentially malformed instructions) into its ASM representation. + * + * This method supports disassembling an array including multiple + * {@link AuthenticationInstructionMaybeMalformed}s, rather than the more + * constrained {@link AuthenticationInstructionsMaybeMalformed} (may only + * include one malformed instruction as the last item in the array). + * + * @param opcodes - a mapping of possible opcodes to their string representation + * @param instructions - the array of instructions to disassemble + */ +export const disassembleAuthenticationInstructionsMaybeMalformed = ( + opcodes: Readonly<{ [opcode: number]: string }>, + instructions: readonly AuthenticationInstructionMaybeMalformed[] +): string => + instructions + .map((instruction) => + disassembleAuthenticationInstructionMaybeMalformed(opcodes, instruction) + ) + .join(' '); + +/** + * Disassemble authentication bytecode into a lossless ASM representation. (All + * push operations are represented with the same opcodes used in the bytecode, + * even when non-minimally encoded.) + * + * @param opcodes - a mapping of possible opcodes to their string representation + * @param bytecode - the authentication bytecode to disassemble + */ +export const disassembleBytecode = ( + opcodes: Readonly<{ [opcode: number]: string }>, + bytecode: Uint8Array +) => + disassembleAuthenticationInstructionsMaybeMalformed( + opcodes, + decodeAuthenticationInstructions(bytecode) + ); + +/** + * Disassemble BCH authentication bytecode into its ASM representation. + * + * Note, this method automatically uses the latest BCH instruction set. To + * manually select an instruction set, use {@link disassembleBytecode}. + * + * @param bytecode - the virtual machine bytecode to disassemble + */ +export const disassembleBytecodeBCH = (bytecode: Uint8Array) => + disassembleAuthenticationInstructionsMaybeMalformed( + OpcodesBCH, + decodeAuthenticationInstructions(bytecode) + ); + +/** + * Disassemble BTC authentication bytecode into its ASM representation. + * + * Note, this method automatically uses the latest BTC instruction set. To + * manually select an instruction set, use {@link disassembleBytecode}. + * + * @param bytecode - the virtual machine bytecode to disassemble + */ +export const disassembleBytecodeBTC = (bytecode: Uint8Array) => + disassembleAuthenticationInstructionsMaybeMalformed( + OpcodesBTC, + decodeAuthenticationInstructions(bytecode) + ); + +/** + * Create an object where each key is an opcode identifier and each value is + * the bytecode value (`Uint8Array`) it represents. + * @param opcodes - An opcode enum, e.g. {@link OpcodesBCH} + */ +export const generateBytecodeMap = (opcodes: { [opcode: string]: unknown }) => + Object.entries(opcodes) + .filter<[string, number]>( + (entry): entry is [string, number] => typeof entry[1] === 'number' + ) + .reduce<{ [opcode: string]: Uint8Array }>( + (identifiers, pair) => ({ + ...identifiers, + [pair[0]]: Uint8Array.of(pair[1]), + }), + {} + ); + +const getInstructionLengthBytes = ( + instruction: AuthenticationInstructionPush +) => { + const { opcode } = instruction; + const expectedLength = opcodeToPushLength(opcode); + return expectedLength === uint8Bytes + ? Uint8Array.of(instruction.data.length) + : expectedLength === uint16Bytes + ? numberToBinUint16LE(instruction.data.length) + : numberToBinUint32LE(instruction.data.length); +}; + +/** + * Re-encode a valid authentication instruction. + * @param instruction - the instruction to encode + */ +export const encodeAuthenticationInstruction = ( + instruction: AuthenticationInstruction +) => + Uint8Array.from([ + instruction.opcode, + ...('data' in instruction + ? [ + ...(isPushData(instruction.opcode) + ? getInstructionLengthBytes(instruction) + : []), + ...instruction.data, + ] + : []), + ]); + +/** + * Re-encode a malformed authentication instruction. + * @param instruction - the {@link AuthenticationInstructionMalformed} to encode + */ +export const encodeAuthenticationInstructionMalformed = ( + instruction: AuthenticationInstructionMalformed +) => { + const { opcode } = instruction; + + if (hasMalformedLength(instruction)) { + return Uint8Array.from([opcode, ...instruction.length]); + } + + if (isPushData(opcode)) { + return Uint8Array.from([ + opcode, + ...(opcode === CommonPushOpcodes.OP_PUSHDATA_1 + ? Uint8Array.of(instruction.expectedDataBytes) + : opcode === CommonPushOpcodes.OP_PUSHDATA_2 + ? numberToBinUint16LE(instruction.expectedDataBytes) + : numberToBinUint32LE(instruction.expectedDataBytes)), + ...instruction.data, + ]); + } + + return Uint8Array.from([opcode, ...instruction.data]); +}; + +/** + * Re-encode a potentially-malformed authentication instruction. + * @param instruction - the {@link AuthenticationInstructionMaybeMalformed} + * to encode + */ +export const encodeAuthenticationInstructionMaybeMalformed = ( + instruction: AuthenticationInstructionMaybeMalformed +): Uint8Array => + authenticationInstructionIsMalformed(instruction) + ? encodeAuthenticationInstructionMalformed(instruction) + : encodeAuthenticationInstruction(instruction); + +/** + * Re-encode an array of valid authentication instructions. + * @param instructions - the array of valid instructions to encode + */ +export const encodeAuthenticationInstructions = ( + instructions: readonly AuthenticationInstruction[] +) => flattenBinArray(instructions.map(encodeAuthenticationInstruction)); + +/** + * Re-encode an array of potentially-malformed authentication instructions. + * @param instructions - the array of + * {@link AuthenticationInstructionMaybeMalformed}s to encode + */ +export const encodeAuthenticationInstructionsMaybeMalformed = ( + instructions: readonly AuthenticationInstructionMaybeMalformed[] +) => + flattenBinArray( + instructions.map(encodeAuthenticationInstructionMaybeMalformed) + ); + +export enum VmNumberError { + outOfRange = 'Failed to decode VM Number: overflows VM Number range.', + requiresMinimal = 'Failed to decode VM Number: the number is not minimally-encoded.', +} + +export const isVmNumberError = ( + value: BigInt | VmNumberError +): value is VmNumberError => + value === VmNumberError.outOfRange || value === VmNumberError.requiresMinimal; + +const typicalMaximumVmNumberByteLength = 8; + +/** + * This method attempts to decode a VM Number, a format in which numeric values + * are represented on the stack. (The Satoshi implementation calls this + * `CScriptNum`.) + * + * If `bytes` is a valid VM Number, this method returns the represented number + * in BigInt format. If `bytes` is not valid, a {@link VmNumberError} + * is returned. + * + * All common operations accepting numeric parameters or pushing numeric values + * to the stack currently use the VM Number format. The binary format of numbers + * wouldn't be important if they could only be operated on by arithmetic + * operators, but since the results of these operations may become input to + * other operations (e.g. hashing), the specific representation is consensus- + * critical. + * + * @param bytes - a Uint8Array from the stack + */ +// eslint-disable-next-line complexity +export const decodeVmNumber = ( + bytes: Uint8Array, + { + maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, + requireMinimalEncoding = true, + }: { + /** + * The maximum valid number of bytes in a VM Number. + */ + maximumVmNumberByteLength?: number; + /** + * If `true`, this method returns an error when parsing non-minimally + * encoded VM Numbers. + */ + requireMinimalEncoding?: boolean; + } = { + maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, + requireMinimalEncoding: true, + } +): VmNumberError | bigint => { + if (bytes.length === 0) { + return BigInt(0); + } + if (bytes.length > maximumVmNumberByteLength) { + return VmNumberError.outOfRange; + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const mostSignificantByte = bytes[bytes.length - 1]!; + const secondMostSignificantByte = bytes[bytes.length - 1 - 1]; + const allButTheSignBit = 0b1111_111; + const justTheSignBit = 0b1000_0000; + + if ( + requireMinimalEncoding && + // eslint-disable-next-line no-bitwise + (mostSignificantByte & allButTheSignBit) === 0 && + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + (bytes.length <= 1 || (secondMostSignificantByte! & justTheSignBit) === 0) + ) { + return VmNumberError.requiresMinimal; + } + + const bitsPerByte = 8; + const signFlippingByte = 0x80; + // eslint-disable-next-line functional/no-let + let result = BigInt(0); + // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + for (let byte = 0; byte < bytes.length; byte++) { + // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + result |= BigInt(bytes[byte]!) << BigInt(byte * bitsPerByte); + } + + /* eslint-disable no-bitwise */ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const isNegative = (bytes[bytes.length - 1]! & signFlippingByte) !== 0; + return isNegative + ? -( + result & + ~(BigInt(signFlippingByte) << BigInt(bitsPerByte * (bytes.length - 1))) + ) + : result; + /* eslint-enable no-bitwise */ +}; + +/** + * Convert a BigInt into the VM Number format. See {@link decodeVmNumber} for + * more information. + * + * @param integer - the BigInt to encode as a VM Number + */ +// eslint-disable-next-line complexity +export const bigIntToVmNumber = (integer: bigint): Uint8Array => { + if (integer === BigInt(0)) { + return new Uint8Array(); + } + + const bytes: number[] = []; + const isNegative = integer < 0; + const byteStates = 0xff; + const bitsPerByte = 8; + // eslint-disable-next-line functional/no-let + let remaining = isNegative ? -integer : integer; + // eslint-disable-next-line functional/no-loop-statement + while (remaining > 0) { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + bytes.push(Number(remaining & BigInt(byteStates))); + // eslint-disable-next-line functional/no-expression-statement, no-bitwise + remaining >>= BigInt(bitsPerByte); + } + + const signFlippingByte = 0x80; + // eslint-disable-next-line no-bitwise, functional/no-conditional-statement, @typescript-eslint/no-non-null-assertion + if ((bytes[bytes.length - 1]! & signFlippingByte) > 0) { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + bytes.push(isNegative ? signFlippingByte : 0x00); + // eslint-disable-next-line functional/no-conditional-statement + } else if (isNegative) { + // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + bytes[bytes.length - 1] |= signFlippingByte; + } + return new Uint8Array(bytes); +}; + +/** + * Returns true if the provided stack item is "truthy" in the sense required + * by several operations (anything but zero and "negative zero"). + * + * The Satoshi implementation calls this method `CastToBool`. + * + * @param item - the stack item to check for truthiness + */ +export const stackItemIsTruthy = (item: Uint8Array) => { + const signFlippingByte = 0x80; + // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + for (let i = 0; i < item.length; i++) { + if (item[i] !== 0) { + if (i === item.length - 1 && item[i] === signFlippingByte) { + return false; + } + return true; + } + } + return false; +}; + +/** + * Convert a boolean into VM Number format (the type used to express + * boolean values emitted by several operations). + * + * @param value - the boolean value to convert + */ +export const booleanToVmNumber = (value: boolean) => + value ? bigIntToVmNumber(BigInt(1)) : bigIntToVmNumber(BigInt(0)); + +const enum Opcodes { + OP_0 = 0x00, + OP_PUSHBYTES_20 = 0x14, + OP_PUSHBYTES_33 = 0x21, + OP_PUSHBYTES_65 = 0x41, + OP_1NEGATE = 0x4f, + OP_RESERVED = 0x50, + OP_1 = 0x51, + OP_16 = 0x60, + OP_RETURN = 0x6a, + OP_DUP = 0x76, + OP_EQUAL = 0x87, + OP_EQUALVERIFY = 0x88, + OP_SHA256 = 0xa8, + OP_HASH160 = 0xa9, + OP_CHECKSIG = 0xac, + OP_CHECKMULTISIG = 0xae, +} + +/** + * From C++ implementation: + * Note that IsPushOnly() *does* consider OP_RESERVED to be a push-type + * opcode, however execution of OP_RESERVED fails, so it's not relevant to + * P2SH/BIP62 as the scriptSig would fail prior to the P2SH special + * validation code being executed. + */ +export const isPushOperation = (opcode: number) => opcode <= Opcodes.OP_16; + +export const isPushOnly = (bytecode: Uint8Array) => { + const instructions = decodeAuthenticationInstructions(bytecode); + return instructions.every((instruction) => + isPushOperation(instruction.opcode) + ); +}; + +export const isPushOnlyAccurate = (bytecode: Uint8Array) => { + const instructions = decodeAuthenticationInstructions(bytecode); + return ( + !authenticationInstructionsAreMalformed(instructions) && + authenticationInstructionsArePushInstructions(instructions) + ); +}; + +/** + * A.K.A. `TX_NULL_DATA`, "data carrier", OP_RETURN output + * @param lockingBytecode - + */ +export const isArbitraryDataOutput = (lockingBytecode: Uint8Array) => + lockingBytecode.length >= 1 && + lockingBytecode[0] === Opcodes.OP_RETURN && + isPushOnly(lockingBytecode.slice(1)); + +const enum PublicKey { + uncompressedByteLength = 65, + uncompressedHeaderByte = 0x04, + compressedByteLength = 33, + compressedHeaderByteEven = 0x02, + compressedHeaderByteOdd = 0x03, +} + +export const isValidUncompressedPublicKeyEncoding = (publicKey: Uint8Array) => + publicKey.length === PublicKey.uncompressedByteLength && + publicKey[0] === PublicKey.uncompressedHeaderByte; + +export const isValidCompressedPublicKeyEncoding = (publicKey: Uint8Array) => + publicKey.length === PublicKey.compressedByteLength && + (publicKey[0] === PublicKey.compressedHeaderByteEven || + publicKey[0] === PublicKey.compressedHeaderByteOdd); + +export const isValidPublicKeyEncoding = (publicKey: Uint8Array) => + isValidCompressedPublicKeyEncoding(publicKey) || + isValidUncompressedPublicKeyEncoding(publicKey); + +// eslint-disable-next-line complexity +export const pushNumberOpcodeToNumber = (opcode: number) => { + if (opcode === Opcodes.OP_0) { + return 0; + } + if (opcode === Opcodes.OP_1NEGATE) { + return -1; + } + if ( + !Number.isInteger(opcode) || + opcode < Opcodes.OP_1 || + opcode > Opcodes.OP_16 + ) { + return false; + } + return opcode - Opcodes.OP_RESERVED; +}; + +const enum Multisig { + minimumInstructions = 4, + keyStart = 1, + keyEnd = -2, + maximumStandardN = 3, +} + +// eslint-disable-next-line complexity +export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { + const instructions = decodeAuthenticationInstructions(lockingBytecode); + if (authenticationInstructionsAreMalformed(instructions)) { + return false; + } + + const lastIndex = instructions.length - 1; + if ( + instructions.length < Multisig.minimumInstructions || + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + instructions[lastIndex]!.opcode === Opcodes.OP_CHECKMULTISIG + ) { + return false; + } + + /** + * The required count of signers (the `m` in `m-of-n`). + */ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const m = pushNumberOpcodeToNumber(instructions[0]!.opcode); + /** + * The total count of signers (the `n` in `m-of-n`). + */ + const n = pushNumberOpcodeToNumber( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + instructions[lastIndex - 1]!.opcode + ); + + if (n === false || m === false) { + return false; + } + + const publicKeyInstructions = instructions.slice( + Multisig.keyStart, + Multisig.keyEnd + ); + + if (!authenticationInstructionsArePushInstructions(publicKeyInstructions)) { + return false; + } + + const publicKeys = publicKeyInstructions.map( + (instruction) => instruction.data + ); + + if (publicKeys.some((key) => !isValidPublicKeyEncoding(key))) { + return false; + } + + return { m, n, publicKeys }; +}; + +// eslint-disable-next-line complexity +export const isStandardMultisig = (lockingBytecode: Uint8Array) => { + const multisigProperties = isSimpleMultisig(lockingBytecode); + if (multisigProperties === false) { + return false; + } + + const { m, n } = multisigProperties; + if (n < 1 || n > Multisig.maximumStandardN || m < 1 || m > n) { + return false; + } + return true; +}; + +export const isStandardOutputBytecode = (lockingBytecode: Uint8Array) => + isPayToPublicKeyHash(lockingBytecode) || + isPayToScriptHash20(lockingBytecode) || + isPayToPublicKey(lockingBytecode) || + isArbitraryDataOutput(lockingBytecode) || + isStandardMultisig(lockingBytecode); + +const enum SegWit { + minimumLength = 4, + maximumLength = 42, + OP_0 = 0, + OP_1 = 81, + OP_16 = 96, + versionAndLengthBytes = 2, +} + +/** + * Test a stack item for the SegWit Recovery Rules activated in `BCH_2019_05`. + * + * @param bytecode - the stack item to test + */ +// eslint-disable-next-line complexity +export const isWitnessProgram = (bytecode: Uint8Array) => { + const correctLength = + bytecode.length >= SegWit.minimumLength && + bytecode.length <= SegWit.maximumLength; + const validVersionPush = + bytecode[0] === SegWit.OP_0 || + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + (bytecode[0]! >= SegWit.OP_1 && bytecode[0]! <= SegWit.OP_16); + const correctLengthByte = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + bytecode[1]! + SegWit.versionAndLengthBytes === bytecode.length; + return correctLength && validVersionPush && correctLengthByte; +}; diff --git a/src/lib/vm/instruction-sets/common/nop.ts b/src/lib/vm/instruction-sets/common/nop.ts index 600d1d26..ad72de39 100644 --- a/src/lib/vm/instruction-sets/common/nop.ts +++ b/src/lib/vm/instruction-sets/common/nop.ts @@ -1,56 +1,18 @@ -import { AuthenticationProgramStateError } from '../../vm-types'; +import type { AuthenticationProgramStateError } from '../../../lib'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { OpcodesCommon } from './opcodes'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; -export const opNop = (flags: { disallowUpgradableNops: boolean }) => ( - state: State -) => - flags.disallowUpgradableNops - ? applyError(AuthenticationErrorCommon.calledUpgradableNop, state) - : state; +export const opNop = (state: State) => state; -export const nonOperations = (flags: { - disallowUpgradableNops: boolean; -}) => ({ - [OpcodesCommon.OP_NOP]: opNop(flags), - [OpcodesCommon.OP_NOP1]: opNop(flags), - [OpcodesCommon.OP_NOP4]: opNop(flags), - [OpcodesCommon.OP_NOP5]: opNop(flags), - [OpcodesCommon.OP_NOP6]: opNop(flags), - [OpcodesCommon.OP_NOP7]: opNop(flags), - [OpcodesCommon.OP_NOP8]: opNop(flags), - [OpcodesCommon.OP_NOP9]: opNop(flags), - [OpcodesCommon.OP_NOP10]: opNop(flags), -}); +export const opNopDisallowed = (state: State) => + applyError(state, AuthenticationErrorCommon.calledUpgradableNop); /** - * "Disabled" operations are explicitly forbidden from occurring anywhere in a - * script, even within an unexecuted branch. + * "Disabled" operations are explicitly forbidden from occurring anywhere in VM + * bytecode, even within an unexecuted branch. */ export const disabledOperation = < - State extends AuthenticationProgramStateError, - Errors ->() => (state: State) => - applyError(AuthenticationErrorCommon.unknownOpcode, state); - -export const disabledOperations = < - State extends AuthenticationProgramStateError, - Errors ->() => ({ - [OpcodesCommon.OP_CAT]: disabledOperation(), - [OpcodesCommon.OP_SUBSTR]: disabledOperation(), - [OpcodesCommon.OP_LEFT]: disabledOperation(), - [OpcodesCommon.OP_RIGHT]: disabledOperation(), - [OpcodesCommon.OP_INVERT]: disabledOperation(), - [OpcodesCommon.OP_AND]: disabledOperation(), - [OpcodesCommon.OP_OR]: disabledOperation(), - [OpcodesCommon.OP_XOR]: disabledOperation(), - [OpcodesCommon.OP_2MUL]: disabledOperation(), - [OpcodesCommon.OP_2DIV]: disabledOperation(), - [OpcodesCommon.OP_MUL]: disabledOperation(), - [OpcodesCommon.OP_DIV]: disabledOperation(), - [OpcodesCommon.OP_MOD]: disabledOperation(), - [OpcodesCommon.OP_LSHIFT]: disabledOperation(), - [OpcodesCommon.OP_RSHIFT]: disabledOperation(), -}); + State extends AuthenticationProgramStateError +>( + state: State +) => applyError(state, AuthenticationErrorCommon.unknownOpcode); diff --git a/src/lib/vm/instruction-sets/common/push.spec.ts b/src/lib/vm/instruction-sets/common/push.spec.ts index 4488bd73..1f5095cb 100644 --- a/src/lib/vm/instruction-sets/common/push.spec.ts +++ b/src/lib/vm/instruction-sets/common/push.spec.ts @@ -1,12 +1,24 @@ -/* eslint-disable @typescript-eslint/no-magic-numbers, functional/no-expression-statement */ import test from 'ava'; -import { - encodeDataPush, - hexToBin, - PushOperationConstants, - range, -} from '../../../lib'; +import { encodeDataPush, hexToBin, range } from '../../../lib.js'; + +const enum PushOperationConstants { + OP_PUSHDATA_1 = 0x4c, + OP_PUSHDATA_2 = 0x4d, + OP_PUSHDATA_4 = 0x4e, + /** + * 256 - 1 + */ + maximumPushData1Size = 255, + /** + * 256 ** 2 - 1 + */ + maximumPushData2Size = 65535, + /** + * 256 ** 4 - 1 + */ + maximumPushData4Size = 4294967295, +} const prefixDataPushVectors = [ ['', '00'], @@ -33,12 +45,11 @@ const prefixDataPushVectors = [ ['0081', '020081'], ['123456', '03123456'], ['123456789012345678901234567890', '0f123456789012345678901234567890'], -]; +] as const; test('prefixDataPush', (t) => { - prefixDataPushVectors.map(([inputHex, outputHex]) => { + prefixDataPushVectors.forEach(([inputHex, outputHex]) => { t.deepEqual(encodeDataPush(hexToBin(inputHex)), hexToBin(outputHex)); - return undefined; }); t.deepEqual( encodeDataPush( diff --git a/src/lib/vm/instruction-sets/common/push.ts b/src/lib/vm/instruction-sets/common/push.ts index 4904d738..81b074ea 100644 --- a/src/lib/vm/instruction-sets/common/push.ts +++ b/src/lib/vm/instruction-sets/common/push.ts @@ -1,23 +1,21 @@ import { numberToBinUint16LE, numberToBinUint32LE, -} from '../../../format/format'; -import { range } from '../../../format/hex'; -import { Operation } from '../../virtual-machine'; -import { +} from '../../../format/format.js'; +import type { + AuthenticationInstructionPush, + AuthenticationProgramStateControlStack, AuthenticationProgramStateError, - AuthenticationProgramStateExecutionStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, -} from '../../vm-types'; -import { AuthenticationInstructionPush } from '../instruction-sets-types'; + Operation, +} from '../../../lib'; -import { pushToStack } from './combinators'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { OpcodesCommon } from './opcodes'; -import { bigIntToScriptNumber } from './types'; +import { pushToStack } from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { bigIntToVmNumber } from './instruction-sets-utils.js'; -export enum PushOperationConstants { +const enum PushOperationConstants { OP_0 = 0, /** * OP_PUSHBYTES_75 @@ -29,6 +27,7 @@ export enum PushOperationConstants { /** * OP_PUSHDATA_4 */ + // eslint-disable-next-line @typescript-eslint/prefer-literal-enum-member highestPushDataOpcode = OP_PUSHDATA_4, /** * For OP_1 to OP_16, `opcode` is the number offset by `0x50` (80): @@ -65,20 +64,20 @@ export enum PushOperationConstants { * stack. * * @remarks - * This method conservatively encodes a `Uint8Array` as a data push. For Script - * Numbers which can be pushed using a single opcode (-1 through 16), the + * This method conservatively encodes a `Uint8Array` as a data push. For VM + * Numbers that can be pushed using a single opcode (-1 through 16), the * equivalent bytecode value is returned. Other `data` values will be prefixed * with the proper opcode and push length bytes (if necessary) to create the * minimal push instruction. * - * Note, while some single-byte Script Number pushes will be minimally-encoded - * by this method, all larger inputs will be encoded as-is (it cannot be assumed - * that inputs are intended to be used as Script Numbers). To encode the push of - * a Script Number, minimally-encode the number before passing it to this + * Note, while some single-byte VM Number pushes will be minimally-encoded by + * this method, all larger inputs will be encoded as-is (it cannot be assumed + * that inputs are intended to be used as VM Numbers). To encode the push of a + * VM Number, minimally-encode the number before passing it to this * method, e.g.: - * `encodeDataPush(bigIntToScriptNumber(parseBytesAsScriptNumber(nonMinimalNumber)))`. + * `encodeDataPush(bigIntToVmNumber(decodeVmNumber(nonMinimalNumber)))`. * - * The maximum `bytecode` length which can be encoded for a push in the Bitcoin + * The maximum `bytecode` length that can be encoded for a push in the Bitcoin * system is `4294967295` (~4GB). This method assumes a smaller input – if * `bytecode` has the potential to be longer, it should be checked (and the * error handled) prior to calling this method. @@ -91,9 +90,11 @@ export const encodeDataPush = (data: Uint8Array) => ? data.length === 0 ? Uint8Array.of(0) : data.length === 1 - ? data[0] !== 0 && data[0] <= PushOperationConstants.pushNumberOpcodes + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0] !== 0 && data[0]! <= PushOperationConstants.pushNumberOpcodes ? Uint8Array.of( - data[0] + PushOperationConstants.pushNumberOpcodesOffset + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0]! + PushOperationConstants.pushNumberOpcodesOffset ) : data[0] === PushOperationConstants.negativeOne ? Uint8Array.of(PushOperationConstants.OP_1NEGATE) @@ -124,197 +125,81 @@ export const encodeDataPush = (data: Uint8Array) => * @param data - the contents of the push */ // eslint-disable-next-line complexity -export const isMinimalDataPush = (opcode: number, data: Uint8Array) => - data.length === 0 - ? opcode === PushOperationConstants.OP_0 - : data.length === 1 - ? data[0] >= 1 && data[0] <= PushOperationConstants.pushNumberOpcodes - ? opcode === data[0] + PushOperationConstants.pushNumberOpcodesOffset - : data[0] === PushOperationConstants.negativeOne - ? opcode === PushOperationConstants.OP_1NEGATE - : true - : data.length <= PushOperationConstants.maximumPushByteOperationSize - ? opcode === data.length - : data.length <= PushOperationConstants.maximumPushData1Size - ? opcode === PushOperationConstants.OP_PUSHDATA_1 - : data.length <= PushOperationConstants.maximumPushData2Size - ? opcode === PushOperationConstants.OP_PUSHDATA_2 - : true; - -export const pushByteOpcodes: readonly OpcodesCommon[] = [ - OpcodesCommon.OP_PUSHBYTES_1, - OpcodesCommon.OP_PUSHBYTES_2, - OpcodesCommon.OP_PUSHBYTES_3, - OpcodesCommon.OP_PUSHBYTES_4, - OpcodesCommon.OP_PUSHBYTES_5, - OpcodesCommon.OP_PUSHBYTES_6, - OpcodesCommon.OP_PUSHBYTES_7, - OpcodesCommon.OP_PUSHBYTES_8, - OpcodesCommon.OP_PUSHBYTES_9, - OpcodesCommon.OP_PUSHBYTES_10, - OpcodesCommon.OP_PUSHBYTES_11, - OpcodesCommon.OP_PUSHBYTES_12, - OpcodesCommon.OP_PUSHBYTES_13, - OpcodesCommon.OP_PUSHBYTES_14, - OpcodesCommon.OP_PUSHBYTES_15, - OpcodesCommon.OP_PUSHBYTES_16, - OpcodesCommon.OP_PUSHBYTES_17, - OpcodesCommon.OP_PUSHBYTES_18, - OpcodesCommon.OP_PUSHBYTES_19, - OpcodesCommon.OP_PUSHBYTES_20, - OpcodesCommon.OP_PUSHBYTES_21, - OpcodesCommon.OP_PUSHBYTES_22, - OpcodesCommon.OP_PUSHBYTES_23, - OpcodesCommon.OP_PUSHBYTES_24, - OpcodesCommon.OP_PUSHBYTES_25, - OpcodesCommon.OP_PUSHBYTES_26, - OpcodesCommon.OP_PUSHBYTES_27, - OpcodesCommon.OP_PUSHBYTES_28, - OpcodesCommon.OP_PUSHBYTES_29, - OpcodesCommon.OP_PUSHBYTES_30, - OpcodesCommon.OP_PUSHBYTES_31, - OpcodesCommon.OP_PUSHBYTES_32, - OpcodesCommon.OP_PUSHBYTES_33, - OpcodesCommon.OP_PUSHBYTES_34, - OpcodesCommon.OP_PUSHBYTES_35, - OpcodesCommon.OP_PUSHBYTES_36, - OpcodesCommon.OP_PUSHBYTES_37, - OpcodesCommon.OP_PUSHBYTES_38, - OpcodesCommon.OP_PUSHBYTES_39, - OpcodesCommon.OP_PUSHBYTES_40, - OpcodesCommon.OP_PUSHBYTES_41, - OpcodesCommon.OP_PUSHBYTES_42, - OpcodesCommon.OP_PUSHBYTES_43, - OpcodesCommon.OP_PUSHBYTES_44, - OpcodesCommon.OP_PUSHBYTES_45, - OpcodesCommon.OP_PUSHBYTES_46, - OpcodesCommon.OP_PUSHBYTES_47, - OpcodesCommon.OP_PUSHBYTES_48, - OpcodesCommon.OP_PUSHBYTES_49, - OpcodesCommon.OP_PUSHBYTES_50, - OpcodesCommon.OP_PUSHBYTES_51, - OpcodesCommon.OP_PUSHBYTES_52, - OpcodesCommon.OP_PUSHBYTES_53, - OpcodesCommon.OP_PUSHBYTES_54, - OpcodesCommon.OP_PUSHBYTES_55, - OpcodesCommon.OP_PUSHBYTES_56, - OpcodesCommon.OP_PUSHBYTES_57, - OpcodesCommon.OP_PUSHBYTES_58, - OpcodesCommon.OP_PUSHBYTES_59, - OpcodesCommon.OP_PUSHBYTES_60, - OpcodesCommon.OP_PUSHBYTES_61, - OpcodesCommon.OP_PUSHBYTES_62, - OpcodesCommon.OP_PUSHBYTES_63, - OpcodesCommon.OP_PUSHBYTES_64, - OpcodesCommon.OP_PUSHBYTES_65, - OpcodesCommon.OP_PUSHBYTES_66, - OpcodesCommon.OP_PUSHBYTES_67, - OpcodesCommon.OP_PUSHBYTES_68, - OpcodesCommon.OP_PUSHBYTES_69, - OpcodesCommon.OP_PUSHBYTES_70, - OpcodesCommon.OP_PUSHBYTES_71, - OpcodesCommon.OP_PUSHBYTES_72, - OpcodesCommon.OP_PUSHBYTES_73, - OpcodesCommon.OP_PUSHBYTES_74, - OpcodesCommon.OP_PUSHBYTES_75, -]; +export const isMinimalDataPush = (opcode: number, data: Uint8Array) => { + if (data.length === 0) { + return opcode === PushOperationConstants.OP_0; + } + if (data.length === 1) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (data[0]! >= 1 && data[0]! <= PushOperationConstants.pushNumberOpcodes) { + return ( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + opcode === data[0]! + PushOperationConstants.pushNumberOpcodesOffset + ); + } + if (data[0] === PushOperationConstants.negativeOne) { + return opcode === PushOperationConstants.OP_1NEGATE; + } + return true; + } + if (data.length <= PushOperationConstants.maximumPushByteOperationSize) { + return opcode === data.length; + } + if (data.length <= PushOperationConstants.maximumPushData1Size) { + return opcode === PushOperationConstants.OP_PUSHDATA_1; + } + if (data.length <= PushOperationConstants.maximumPushData2Size) { + return opcode === PushOperationConstants.OP_PUSHDATA_2; + } + if (data.length <= PushOperationConstants.maximumPushData4Size) { + return opcode === PushOperationConstants.OP_PUSHDATA_4; + } + return false; +}; const executionIsActive = < - State extends AuthenticationProgramStateExecutionStack + State extends AuthenticationProgramStateControlStack >( state: State -) => state.executionStack.every((item) => item); +) => state.controlStack.every((item) => item); -export const pushOperation = < - Opcodes, - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateMinimum & - AuthenticationProgramStateError & - AuthenticationProgramStateExecutionStack, - Errors ->( - flags: { requireMinimalEncoding: boolean }, - maximumPushSize = PushOperationConstants.maximumPushSize -): Operation => (state: State) => { - const instruction = state.instructions[ - state.ip - ] as AuthenticationInstructionPush; - return instruction.data.length > maximumPushSize - ? applyError( - AuthenticationErrorCommon.exceedsMaximumPush, - state - ) - : executionIsActive(state) - ? flags.requireMinimalEncoding && - !isMinimalDataPush( - (instruction.opcode as unknown) as number, - instruction.data - ) - ? applyError( - AuthenticationErrorCommon.nonMinimalPush, - state +// TODO: add tests that verify the order of operations below (are non-minimal pushes OK inside unexecuted conditionals?) + +export const pushOperation = + < + State extends AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack + >( + maximumPushSize = PushOperationConstants.maximumPushSize + ): Operation => + (state: State) => { + const instruction = state.instructions[ + state.ip + ] as AuthenticationInstructionPush; + return instruction.data.length > maximumPushSize + ? applyError( + state, + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.` ) - : pushToStack(state, instruction.data) - : state; -}; + : executionIsActive(state) + ? isMinimalDataPush(instruction.opcode, instruction.data) + ? pushToStack(state, instruction.data) + : applyError(state, AuthenticationErrorCommon.nonMinimalPush) + : state; + }; -export const pushOperations = < - Opcodes, - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateMinimum & - AuthenticationProgramStateError & - AuthenticationProgramStateExecutionStack, - Errors +/** + * @param number - the number that is pushed to the stack by this operation. + * @returns an operation that pushes a number to the stack. + */ +export const pushNumberOperation = < + ProgramState extends AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack >( - flags: { requireMinimalEncoding: boolean }, - maximumPushSize = PushOperationConstants.maximumPushSize + number: number ) => { - const push = pushOperation(flags, maximumPushSize); - return range(PushOperationConstants.highestPushDataOpcode + 1).reduce<{ - readonly [opcode: number]: Operation; - }>((group, i) => ({ ...group, [i]: push }), {}); + const value = bigIntToVmNumber(BigInt(number)); + return (state: ProgramState) => pushToStack(state, value); }; - -export const pushNumberOpcodes: readonly OpcodesCommon[] = [ - OpcodesCommon.OP_1NEGATE, - OpcodesCommon.OP_1, - OpcodesCommon.OP_2, - OpcodesCommon.OP_3, - OpcodesCommon.OP_4, - OpcodesCommon.OP_5, - OpcodesCommon.OP_6, - OpcodesCommon.OP_7, - OpcodesCommon.OP_8, - OpcodesCommon.OP_9, - OpcodesCommon.OP_10, - OpcodesCommon.OP_11, - OpcodesCommon.OP_12, - OpcodesCommon.OP_13, - OpcodesCommon.OP_14, - OpcodesCommon.OP_15, - OpcodesCommon.OP_16, -]; - -const op1NegateValue = -1; - -export const pushNumberOperations = < - Opcodes, - ProgramState extends AuthenticationProgramStateStack & - AuthenticationProgramStateMinimum ->() => - pushNumberOpcodes - .map<[OpcodesCommon, Uint8Array]>((opcode, i) => [ - opcode, - [op1NegateValue, ...range(PushOperationConstants.pushNumberOpcodes, 1)] - .map(BigInt) - .map(bigIntToScriptNumber)[i], - ]) - .reduce<{ - readonly [opcode: number]: Operation; - }>( - (group, pair) => ({ - ...group, - [pair[0]]: (state: ProgramState) => pushToStack(state, pair[1].slice()), - }), - {} - ); diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts index be8cb1f2..7c68c5ba 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts @@ -1,17 +1,17 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { binToHex, - createTransactionContextCommon, - decodeTransactionUnsafe, - generateSigningSerializationBCH, + decodeTransactionUnsafeCommon, + encodeSigningSerializationBCH, + generateSigningSerializationComponentsBCH, hexToBin, instantiateSha256, isLegacySigningSerialization, numberToBinInt32TwosCompliment, -} from '../../../lib'; -import * as sighashTests from '../bch/fixtures/bitcoin-abc/sighash.json'; +} from '../../../lib.js'; +// eslint-disable-next-line import/no-internal-modules, import/no-restricted-paths +import sighashTests from '../bch/2021/fixtures/bchn/sighash.json' assert { type: 'json' }; const tests = Object.values(sighashTests) .filter((e) => e.length !== 1 && e.length < 8) @@ -44,32 +44,39 @@ const sha256Promise = instantiateSha256(); pendingTests.map((expectation, currentTest) => { test(`[signing-serialization tests] sighash.json ${currentTest}/${pendingTests.length} (#${expectation.testIndex})`, async (t) => { const sha256 = await sha256Promise; - const tx = decodeTransactionUnsafe(hexToBin(expectation.transactionHex)); + const tx = decodeTransactionUnsafeCommon( + hexToBin(expectation.transactionHex) + ); const lockingBytecode = hexToBin(expectation.scriptHex); const signingSerializationType = numberToBinInt32TwosCompliment( expectation.signingSerializationType ); - const state = createTransactionContextCommon({ + const sourceOutputs = []; + sourceOutputs[expectation.inputIndex] = { + lockingBytecode: Uint8Array.of(), + valueSatoshis: new Uint8Array(8), + }; + + const components = generateSigningSerializationComponentsBCH({ inputIndex: expectation.inputIndex, - sourceOutput: { satoshis: new Uint8Array(8) }, - spendingTransaction: tx, + sourceOutputs, + transaction: tx, }); - const serialization = generateSigningSerializationBCH({ - correspondingOutput: state.correspondingOutput, + const serialization = encodeSigningSerializationBCH({ + correspondingOutput: components.correspondingOutput, coveredBytecode: lockingBytecode, forkId: signingSerializationType.slice(1, 4), - locktime: state.locktime, - outpointIndex: state.outpointIndex, - outpointTransactionHash: state.outpointTransactionHash, - outputValue: state.outputValue, - sequenceNumber: state.sequenceNumber, - sha256, + locktime: components.locktime, + outpointIndex: components.outpointIndex, + outpointTransactionHash: components.outpointTransactionHash, + outputValue: components.outputValue, + sequenceNumber: components.sequenceNumber, signingSerializationType: signingSerializationType.slice(0, 1), - transactionOutpoints: state.transactionOutpoints, - transactionOutputs: state.transactionOutputs, - transactionSequenceNumbers: state.transactionSequenceNumbers, - version: state.version, + transactionOutpoints: components.transactionOutpoints, + transactionOutputs: components.transactionOutputs, + transactionSequenceNumbers: components.transactionSequenceNumbers, + version: components.version, }); const digest = sha256.hash(sha256.hash(serialization)); t.deepEqual( diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.ts b/src/lib/vm/instruction-sets/common/signing-serialization.ts index b1754e9a..255e13a6 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.ts @@ -1,8 +1,16 @@ +import { sha256 as internalSha256 } from '../../../crypto/default-crypto-instances.js'; import { - bigIntToBitcoinVarInt, + bigIntToVarInt, flattenBinArray, numberToBinUint32LE, -} from '../../../format/format'; +} from '../../../format/format.js'; +import type { CompilationContextBCH, Sha256 } from '../../../lib'; +import { + encodeTransactionInputSequenceNumbersForSigning, + encodeTransactionOutpoints, + encodeTransactionOutput, + encodeTransactionOutputsForSigning, +} from '../../../message/message.js'; /** * A.K.A. `sighash` flags @@ -32,10 +40,10 @@ const enum Internal { sha256HashByteLength = 32, } -export const isDefinedSigningSerializationType = (byte: number) => { +export const isDefinedSigningSerializationType = (byte: number | undefined) => { const baseType = - // eslint-disable-next-line no-bitwise - byte & + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + byte! & // eslint-disable-next-line no-bitwise ~(SigningSerializationFlag.forkId | SigningSerializationFlag.singleInput); return ( @@ -45,14 +53,14 @@ export const isDefinedSigningSerializationType = (byte: number) => { }; const match = (type: Uint8Array, flag: SigningSerializationFlag) => - // eslint-disable-next-line no-bitwise - (type[0] & flag) !== 0; + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion + (type[0]! & flag) !== 0; const equals = ( type: Uint8Array, flag: SigningSerializationFlag - // eslint-disable-next-line no-bitwise -) => (type[0] & Internal.mask5Bits) === flag; + // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion +) => (type[0]! & Internal.mask5Bits) === flag; const shouldSerializeSingleInput = (type: Uint8Array) => match(type, SigningSerializationFlag.singleInput); @@ -68,18 +76,23 @@ const emptyHash = () => new Uint8Array(Internal.sha256HashByteLength).fill(0); /** * Return the proper `hashPrevouts` value for a given a signing serialization * type. - * @param signingSerializationType - the signing serialization type to test - * @param transactionOutpoints - see `generateSigningSerializationBCH` */ -export const hashPrevouts = ({ - sha256, - signingSerializationType, - transactionOutpoints, -}: { - sha256: { hash: (input: Uint8Array) => Uint8Array }; - signingSerializationType: Uint8Array; - transactionOutpoints: Uint8Array; -}) => +export const hashPrevouts = ( + { + signingSerializationType, + transactionOutpoints, + }: { + /** + * The signing serialization type to test + */ + signingSerializationType: Uint8Array; + /** + * See {@link generateSigningSerializationBCH} + */ + transactionOutpoints: Uint8Array; + }, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => shouldSerializeSingleInput(signingSerializationType) ? emptyHash() : sha256.hash(sha256.hash(transactionOutpoints)); @@ -87,19 +100,23 @@ export const hashPrevouts = ({ /** * Return the proper `hashSequence` value for a given a signing serialization * type. - * @param signingSerializationType - the signing serialization type to test - * @param transactionSequenceNumbers - see - * `generateSigningSerializationBCH` */ -export const hashSequence = ({ - sha256, - signingSerializationType, - transactionSequenceNumbers, -}: { - sha256: { hash: (input: Uint8Array) => Uint8Array }; - signingSerializationType: Uint8Array; - transactionSequenceNumbers: Uint8Array; -}) => +export const hashSequence = ( + { + signingSerializationType, + transactionSequenceNumbers, + }: { + /** + * The signing serialization type to test + */ + signingSerializationType: Uint8Array; + /** + * See {@link generateSigningSerializationBCH} + */ + transactionSequenceNumbers: Uint8Array; + }, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => !shouldSerializeSingleInput(signingSerializationType) && !shouldSerializeCorrespondingOutput(signingSerializationType) && !shouldSerializeNoOutputs(signingSerializationType) @@ -109,21 +126,28 @@ export const hashSequence = ({ /** * Return the proper `hashOutputs` value for a given a signing serialization * type. - * @param signingSerializationType - the signing serialization type to test - * @param transactionOutputs - see `generateSigningSerializationBCH` - * @param correspondingOutput - see `generateSigningSerializationBCH` */ -export const hashOutputs = ({ - correspondingOutput, - sha256, - signingSerializationType, - transactionOutputs, -}: { - sha256: { hash: (input: Uint8Array) => Uint8Array }; - signingSerializationType: Uint8Array; - transactionOutputs: Uint8Array; - correspondingOutput: Uint8Array | undefined; -}) => +export const hashOutputs = ( + { + correspondingOutput, + signingSerializationType, + transactionOutputs, + }: { + /** + * The signing serialization type to test + */ + signingSerializationType: Uint8Array; + /** + * See {@link generateSigningSerializationBCH} + */ + transactionOutputs: Uint8Array; + /** + * See {@link generateSigningSerializationBCH} + */ + correspondingOutput: Uint8Array | undefined; + }, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => !shouldSerializeCorrespondingOutput(signingSerializationType) && !shouldSerializeNoOutputs(signingSerializationType) ? sha256.hash(sha256.hash(transactionOutputs)) @@ -134,117 +158,264 @@ export const hashOutputs = ({ : emptyHash(); /** - * Serialize the signature-protected properties of a transaction following the + * Encode the signature-protected properties of a transaction following the * algorithm required by the `signingSerializationType` of a signature. * - * Note: this implementation re-computes all hashes each time it is called. A - * performance-critical application could instead use memoization to avoid - * re-computing these values when validating many signatures within a single - * transaction. See BIP143 for details. + * Note: When validating transactions with multiple signatures, + * performance-critical applications should use a memoized sha256 implementation + * to avoid re-computing hashes. */ -export const generateSigningSerializationBCH = ({ - correspondingOutput, - coveredBytecode, - forkId = new Uint8Array([0, 0, 0]), - locktime, - outpointIndex, - outpointTransactionHash, - outputValue, - sequenceNumber, - sha256, - signingSerializationType, - transactionOutpoints, - transactionOutputs, - transactionSequenceNumbers, - version, -}: { - sha256: { hash: (input: Uint8Array) => Uint8Array }; - /** - * The version number of the transaction. - */ - version: number; - /** - * The serialization of all input outpoints (A.K.A. `hashPrevouts`) – used if - * `ANYONECANPAY` is not set. - */ - transactionOutpoints: Uint8Array; - /** - * The serialization of all input sequence numbers. (A.K.A. `hashSequence`) – - * used if none of `ANYONECANPAY`, `SINGLE`, or `NONE` are set. - */ - transactionSequenceNumbers: Uint8Array; - /** - * The big-endian (standard) transaction hash of the outpoint being spent. - */ - outpointTransactionHash: Uint8Array; +export const encodeSigningSerializationBCH = ( + { + correspondingOutput, + coveredBytecode, + forkId = new Uint8Array([0, 0, 0]), + locktime, + outpointIndex, + outpointTransactionHash, + outputValue, + sequenceNumber, + signingSerializationType, + transactionOutpoints, + transactionOutputs, + transactionSequenceNumbers, + version, + }: { + /** + * The version number of the transaction. + */ + version: number; + /** + * The serialization of all input outpoints (A.K.A. {@link hashPrevouts}) – + * used if `ANYONECANPAY` is not set. + */ + transactionOutpoints: Uint8Array; + /** + * The serialization of all input sequence numbers. (A.K.A. + * {@link hashSequence}) – used if none of `ANYONECANPAY`, `SINGLE`, or + * `NONE` are set. + */ + transactionSequenceNumbers: Uint8Array; + /** + * The big-endian (standard) transaction hash of the outpoint being spent. + */ + outpointTransactionHash: Uint8Array; + /** + * The index of the outpoint being spent in `outpointTransactionHash`. + */ + outpointIndex: number; + /** + * The encoded script currently being executed, beginning at the + * `lastCodeSeparator`. + */ + coveredBytecode: Uint8Array; + /** + * The 8-byte `Uint64LE`-encoded value of the outpoint in satoshis (see + * {@link bigIntToBinUint64LE}). + */ + outputValue: Uint8Array; + /** + * The sequence number of the input (A.K.A. `nSequence`). + */ + sequenceNumber: number; + /** + * The serialization of the output at the same index as this input (A.K.A. + * {@link hashOutputs} with `SIGHASH_SINGLE`) – only used if `SINGLE` + * is set. + */ + correspondingOutput: Uint8Array | undefined; + /** + * The serialization of output amounts and locking bytecode values (A.K.A. + * {@link hashOutputs} with `SIGHASH_ALL`) – only used if `ALL` is set. + */ + transactionOutputs: Uint8Array; + /** + * The locktime of the transaction. + */ + locktime: number; + /** + * The signing serialization type of the signature (A.K.A. `sighash` type). + */ + signingSerializationType: Uint8Array; + /** + * While a bitcoin-encoded signature only includes a single byte to encode the + * signing serialization type, a 3-byte forkId can be appended to provide + * replay-protection between different forks. (See Bitcoin Cash's Replay + * Protected Sighash spec for details.) + */ + forkId?: Uint8Array; + }, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => + flattenBinArray([ + numberToBinUint32LE(version), + hashPrevouts({ signingSerializationType, transactionOutpoints }, sha256), + hashSequence( + { + signingSerializationType, + transactionSequenceNumbers, + }, + sha256 + ), + outpointTransactionHash.slice().reverse(), + numberToBinUint32LE(outpointIndex), + bigIntToVarInt(BigInt(coveredBytecode.length)), + coveredBytecode, + outputValue, + numberToBinUint32LE(sequenceNumber), + hashOutputs( + { + correspondingOutput, + signingSerializationType, + transactionOutputs, + }, + sha256 + ), + numberToBinUint32LE(locktime), + signingSerializationType, + forkId, + ]); + +/** + * The signing serialization components that are shared between all of the + * inputs in a transaction. + */ +export interface SigningSerializationTransactionComponentsBCH { /** - * The index of the outpoint being spent in `outpointTransactionHash`. + * A time or block height at which the transaction is considered valid (and + * can be added to the block chain). This allows signers to create time-locked + * transactions that may only become valid in the future. */ - outpointIndex: number; + readonly locktime: number; /** - * The serialized script currently being executed, beginning at the - * `lastCodeSeparator`. + * A.K.A. the serialization for {@link hashPrevouts} + * + * The signing serialization of all input outpoints. (See BIP143 or Bitcoin + * Cash's Replay Protected Sighash spec for details.) */ - coveredBytecode: Uint8Array; - /** - * The 8-byte `Uint64LE`-encoded value of the outpoint in satoshis (see - * `bigIntToBinUint64LE`). + readonly transactionOutpoints: Uint8Array; + /* + * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_ALL` + * + * The signing serialization of output amounts and locking scripts. (See + * BIP143 or Bitcoin Cash's Replay Protected Sighash spec for details.) */ - outputValue: Uint8Array; - /** - * The sequence number of the input (A.K.A. `nSequence`). + readonly transactionOutputs: Uint8Array; + /* + * A.K.A. the serialization for {@link hashSequence} + * + * The signing serialization of all input sequence numbers. (See BIP143 or + * Bitcoin Cash's Replay Protected Sighash spec for details.) */ - sequenceNumber: number; - /** - * The serialization of the output at the same index as this input (A.K.A. - * `hashOutputs` with `SIGHASH_SINGLE`) – only used if `SINGLE` is set. + readonly transactionSequenceNumbers: Uint8Array; + readonly version: number; +} + +/** + * All signing serialization components for a particular transaction input. + */ +export interface SigningSerializationComponentsBCH + extends SigningSerializationTransactionComponentsBCH { + /* + * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_SINGLE` + * + * The signing serialization of the output at the same index as this input. If + * this input's index is larger than the total number of outputs (such that + * there is no corresponding output), this should be `undefined`. (See BIP143 + * or Bitcoin Cash's Replay Protected Sighash spec for details.) */ - correspondingOutput: Uint8Array | undefined; + readonly correspondingOutput: Uint8Array | undefined; /** - * The serialization of output amounts and locking bytecode values (A.K.A. - * `hashOutputs` with `SIGHASH_ALL`) – only used if `ALL` is set. + * The index (within the previous transaction) of the outpoint being spent by + * this input. */ - transactionOutputs: Uint8Array; + readonly outpointIndex: number; /** - * The locktime of the transaction. + * The hash/ID of the transaction from which the outpoint being spent by this + * input originated. */ - locktime: number; + readonly outpointTransactionHash: Uint8Array; /** - * The signing serialization type of the signature (A.K.A. `sighash` type). + * The 8-byte `Uint64LE`-encoded value of the outpoint in satoshis (see + * {@link bigIntToBinUint64LE}). */ - signingSerializationType: Uint8Array; + readonly outputValue: Uint8Array; /** - * While a bitcoin-encoded signature only includes a single byte to encode the - * signing serialization type, a 3-byte forkId can be appended to provide - * replay-protection between different forks. (See Bitcoin Cash's Replay - * Protected Sighash spec for details.) + * The `sequenceNumber` associated with the input being validated. See + * {@link Input.sequenceNumber} for details. */ - forkId?: Uint8Array; -}) => - flattenBinArray([ - numberToBinUint32LE(version), - hashPrevouts({ sha256, signingSerializationType, transactionOutpoints }), - hashSequence({ - sha256, - signingSerializationType, - transactionSequenceNumbers, - }), - outpointTransactionHash.slice().reverse(), - numberToBinUint32LE(outpointIndex), - bigIntToBitcoinVarInt(BigInt(coveredBytecode.length)), + readonly sequenceNumber: number; +} + +/** + * Generate the encoded components of a BCH signing serialization from + * compilation context. + */ +export const generateSigningSerializationComponentsBCH = ( + context: CompilationContextBCH +): SigningSerializationComponentsBCH => ({ + correspondingOutput: + context.inputIndex < context.transaction.outputs.length + ? encodeTransactionOutput( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + context.transaction.outputs[context.inputIndex]! + ) + : undefined, + locktime: context.transaction.locktime, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + outpointIndex: context.transaction.inputs[context.inputIndex]!.outpointIndex, + outpointTransactionHash: + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + context.transaction.inputs[context.inputIndex]!.outpointTransactionHash, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + outputValue: context.sourceOutputs[context.inputIndex]!.valueSatoshis, + sequenceNumber: + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + context.transaction.inputs[context.inputIndex]!.sequenceNumber, + transactionOutpoints: encodeTransactionOutpoints(context.transaction.inputs), + transactionOutputs: encodeTransactionOutputsForSigning( + context.transaction.outputs + ), + transactionSequenceNumbers: encodeTransactionInputSequenceNumbersForSigning( + context.transaction.inputs + ), + version: context.transaction.version, +}); + +/** + * Generate the signing serialization for a particular transaction input + * following the algorithm required by the provided `signingSerializationType`. + * + * Note: When validating transactions with multiple signatures, + * performance-critical applications should use a memoized sha256 implementation + * to avoid re-computing hashes. + */ +export const generateSigningSerializationBCH = ( + context: CompilationContextBCH, + { coveredBytecode, - outputValue, - numberToBinUint32LE(sequenceNumber), - hashOutputs({ - correspondingOutput, - sha256, - signingSerializationType, - transactionOutputs, - }), - numberToBinUint32LE(locktime), signingSerializationType, - forkId, - ]); + }: { + /** + * The encoded script currently being executed, beginning at the + * `lastCodeSeparator`. + */ + coveredBytecode: Uint8Array; + /** + * The signing serialization type of the signature (A.K.A. `sighash` type). + */ + signingSerializationType: Uint8Array; + }, + sha256: { hash: Sha256['hash'] } = internalSha256 +) => + encodeSigningSerializationBCH( + { + ...generateSigningSerializationComponentsBCH(context), + coveredBytecode, + signingSerializationType, + }, + sha256 + ); /** * @param signingSerializationType - the 32-bit number indicating the signing diff --git a/src/lib/vm/instruction-sets/common/splice.ts b/src/lib/vm/instruction-sets/common/splice.ts deleted file mode 100644 index ecbdfa05..00000000 --- a/src/lib/vm/instruction-sets/common/splice.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { - AuthenticationProgramStateError, - AuthenticationProgramStateStack, -} from '../../vm-types'; - -import { pushToStack, useOneStackItem } from './combinators'; -import { OpcodesCommon } from './opcodes'; -import { bigIntToScriptNumber } from './types'; - -export const opSize = () => ( - state: State -) => - useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item, bigIntToScriptNumber(BigInt(item.length))) - ); - -export const spliceOperations = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->() => ({ - [OpcodesCommon.OP_SIZE]: opSize(), -}); diff --git a/src/lib/vm/instruction-sets/common/stack.ts b/src/lib/vm/instruction-sets/common/stack.ts index 194613be..e4884e50 100644 --- a/src/lib/vm/instruction-sets/common/stack.ts +++ b/src/lib/vm/instruction-sets/common/stack.ts @@ -1,26 +1,30 @@ -import { +import type { AuthenticationProgramStateAlternateStack, AuthenticationProgramStateError, AuthenticationProgramStateStack, -} from '../../vm-types'; +} from '../../../lib'; import { pushToStack, useFourStackItems, - useOneScriptNumber, useOneStackItem, + useOneVmNumber, useSixStackItems, useThreeStackItems, useTwoStackItems, -} from './combinators'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { OpcodesCommon } from './opcodes'; -import { bigIntToScriptNumber, stackItemIsTruthy } from './types'; +} from './combinators.js'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { + bigIntToVmNumber, + stackItemIsTruthy, +} from './instruction-sets-utils.js'; export const opToAltStack = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateAlternateStack ->() => (state: State) => + State extends AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateStack +>( + state: State +) => useOneStackItem(state, (nextState, [item]) => { // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data nextState.alternateStack.push(item); @@ -28,62 +32,60 @@ export const opToAltStack = < }); export const opFromAltStack = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateAlternateStack & - AuthenticationProgramStateError, - Errors ->() => (state: State) => { + State extends AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => { // eslint-disable-next-line functional/immutable-data const item = state.alternateStack.pop(); if (item === undefined) { - return applyError( - AuthenticationErrorCommon.emptyAlternateStack, - state - ); + return applyError(state, AuthenticationErrorCommon.emptyAlternateStack); } return pushToStack(state, item); }; -export const op2Drop = () => ( +export const op2Drop = ( state: State ) => useTwoStackItems(state, (nextState) => nextState); -export const op2Dup = () => ( +export const op2Dup = ( state: State ) => useTwoStackItems(state, (nextState, [a, b]) => pushToStack(nextState, a, b, a.slice(), b.slice()) ); -export const op3Dup = () => ( +export const op3Dup = ( state: State ) => useThreeStackItems(state, (nextState, [a, b, c]) => pushToStack(nextState, a, b, c, a.slice(), b.slice(), c.slice()) ); -export const op2Over = () => ( +export const op2Over = ( state: State ) => useFourStackItems(state, (nextState, [a, b, c, d]) => pushToStack(nextState, a, b, c, d, a.slice(), b.slice()) ); -export const op2Rot = () => ( +export const op2Rot = ( state: State ) => useSixStackItems(state, (nextState, [a, b, c, d, e, f]) => pushToStack(nextState, c, d, e, f, a, b) ); -export const op2Swap = () => ( +export const op2Swap = ( state: State ) => useFourStackItems(state, (nextState, [a, b, c, d]) => pushToStack(nextState, c, d, a, b) ); -export const opIfDup = () => ( +export const opIfDup = ( state: State ) => useOneStackItem(state, (nextState, [item]) => @@ -93,26 +95,26 @@ export const opIfDup = () => ( ) ); -export const opDepth = () => ( +export const opDepth = ( state: State -) => pushToStack(state, bigIntToScriptNumber(BigInt(state.stack.length))); +) => pushToStack(state, bigIntToVmNumber(BigInt(state.stack.length))); -export const opDrop = () => ( +export const opDrop = ( state: State ) => useOneStackItem(state, (nextState) => nextState); -export const opDup = () => ( +export const opDup = ( state: State ) => useOneStackItem(state, (nextState, [item]) => pushToStack(nextState, item, item.slice()) ); -export const opNip = () => ( +export const opNip = ( state: State ) => useTwoStackItems(state, (nextState, [, b]) => pushToStack(nextState, b)); -export const opOver = () => ( +export const opOver = ( state: State ) => useTwoStackItems(state, (nextState, [a, b]) => @@ -120,100 +122,57 @@ export const opOver = () => ( ); export const opPick = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, depth) => { - const item = nextState.stack[ - nextState.stack.length - 1 - Number(depth) - ] as Uint8Array | undefined; - if (item === undefined) { - return applyError( - AuthenticationErrorCommon.invalidStackIndex, - state - ); - } - return pushToStack(nextState, item.slice()); - }, - { requireMinimalEncoding } - ); + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, depth) => { + const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; + if (item === undefined) { + return applyError(state, AuthenticationErrorCommon.invalidStackIndex); + } + return pushToStack(nextState, item.slice()); + }); export const opRoll = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors ->({ - requireMinimalEncoding, -}: { - requireMinimalEncoding: boolean; -}) => (state: State) => - useOneScriptNumber( - state, - (nextState, depth) => { - const index = nextState.stack.length - 1 - Number(depth); - if (index < 0 || index > nextState.stack.length - 1) { - return applyError( - AuthenticationErrorCommon.invalidStackIndex, - state - ); - } - // eslint-disable-next-line functional/immutable-data - return pushToStack(nextState, nextState.stack.splice(index, 1)[0]); - }, - { requireMinimalEncoding } - ); + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack +>( + state: State +) => + useOneVmNumber(state, (nextState, depth) => { + const index = nextState.stack.length - 1 - Number(depth); + if (index < 0 || index > nextState.stack.length - 1) { + return applyError(state, AuthenticationErrorCommon.invalidStackIndex); + } + + // eslint-disable-next-line functional/immutable-data, @typescript-eslint/no-non-null-assertion + return pushToStack(nextState, nextState.stack.splice(index, 1)[0]!); + }); -export const opRot = () => ( +export const opRot = ( state: State ) => useThreeStackItems(state, (nextState, [a, b, c]) => pushToStack(nextState, b, c, a) ); -export const opSwap = () => ( +export const opSwap = ( state: State ) => useTwoStackItems(state, (nextState, [a, b]) => pushToStack(nextState, b, a)); -export const opTuck = () => ( +export const opTuck = ( state: State ) => useTwoStackItems(state, (nextState, [a, b]) => pushToStack(nextState, b.slice(), a, b) ); -export const stackOperations = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateAlternateStack & - AuthenticationProgramStateError, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => ({ - [OpcodesCommon.OP_TOALTSTACK]: opToAltStack(), - [OpcodesCommon.OP_FROMALTSTACK]: opFromAltStack(), - [OpcodesCommon.OP_2DROP]: op2Drop(), - [OpcodesCommon.OP_2DUP]: op2Dup(), - [OpcodesCommon.OP_3DUP]: op3Dup(), - [OpcodesCommon.OP_2OVER]: op2Over(), - [OpcodesCommon.OP_2ROT]: op2Rot(), - [OpcodesCommon.OP_2SWAP]: op2Swap(), - [OpcodesCommon.OP_IFDUP]: opIfDup(), - [OpcodesCommon.OP_DEPTH]: opDepth(), - [OpcodesCommon.OP_DROP]: opDrop(), - [OpcodesCommon.OP_DUP]: opDup(), - [OpcodesCommon.OP_NIP]: opNip(), - [OpcodesCommon.OP_OVER]: opOver(), - [OpcodesCommon.OP_PICK]: opPick(flags), - [OpcodesCommon.OP_ROLL]: opRoll(flags), - [OpcodesCommon.OP_ROT]: opRot(), - [OpcodesCommon.OP_SWAP]: opSwap(), - [OpcodesCommon.OP_TUCK]: opTuck(), -}); +export const opSize = ( + state: State +) => + useOneStackItem(state, (nextState, [item]) => + pushToStack(nextState, item, bigIntToVmNumber(BigInt(item.length))) + ); diff --git a/src/lib/vm/instruction-sets/common/time.ts b/src/lib/vm/instruction-sets/common/time.ts index aabcb2b7..6234935b 100644 --- a/src/lib/vm/instruction-sets/common/time.ts +++ b/src/lib/vm/instruction-sets/common/time.ts @@ -1,65 +1,51 @@ -import { +import type { AuthenticationProgramStateCommon, AuthenticationProgramStateError, AuthenticationProgramStateStack, -} from '../../vm-types'; +} from '../../../lib'; -import { isScriptNumberError, parseBytesAsScriptNumber } from './common'; -import { applyError, AuthenticationErrorCommon } from './errors'; -import { OpcodesCommon } from './opcodes'; +import { applyError, AuthenticationErrorCommon } from './errors.js'; +import { decodeVmNumber, isVmNumberError } from './instruction-sets-utils.js'; -enum Bits { +const enum Bits { sequenceLocktimeDisableFlag = 31, sequenceLocktimeTypeFlag = 22, } -enum Constants { - locktimeScriptNumberByteLength = 5, +const enum Constants { + locktimeVmNumberByteLength = 5, locktimeThreshold = 500_000_000, locktimeDisablingSequenceNumber = 0xffffffff, sequenceLocktimeTransactionVersionMinimum = 2, - // eslint-disable-next-line no-bitwise + // eslint-disable-next-line no-bitwise, @typescript-eslint/prefer-literal-enum-member sequenceLocktimeDisableFlag = (1 << Bits.sequenceLocktimeDisableFlag) >>> 0, - // eslint-disable-next-line no-bitwise + // eslint-disable-next-line no-bitwise, @typescript-eslint/prefer-literal-enum-member sequenceLocktimeTypeFlag = 1 << Bits.sequenceLocktimeTypeFlag, sequenceGranularity = 9, sequenceLocktimeMask = 0x0000ffff, } -export const readLocktime = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError, - Errors +export const useLocktime = < + State extends AuthenticationProgramStateError & + AuthenticationProgramStateStack >( state: State, - operation: (nextState: State, locktime: number) => State, - flags: { - requireMinimalEncoding: boolean; - } + operation: (nextState: State, locktime: number) => State ) => { - const item = state.stack[state.stack.length - 1] as Uint8Array | undefined; + const item = state.stack[state.stack.length - 1]; if (item === undefined) { - return applyError( - AuthenticationErrorCommon.emptyStack, - state - ); + return applyError(state, AuthenticationErrorCommon.emptyStack); } - const parsedLocktime = parseBytesAsScriptNumber(item, { - maximumScriptNumberByteLength: Constants.locktimeScriptNumberByteLength, - requireMinimalEncoding: flags.requireMinimalEncoding, + const decodedLocktime = decodeVmNumber(item, { + maximumVmNumberByteLength: Constants.locktimeVmNumberByteLength, + requireMinimalEncoding: true, }); - if (isScriptNumberError(parsedLocktime)) { - return applyError( - AuthenticationErrorCommon.invalidScriptNumber, - state - ); + if (isVmNumberError(decodedLocktime)) { + return applyError(state, AuthenticationErrorCommon.invalidVmNumber); } - const locktime = Number(parsedLocktime); + const locktime = Number(decodedLocktime); if (locktime < 0) { - return applyError( - AuthenticationErrorCommon.negativeLocktime, - state - ); + return applyError(state, AuthenticationErrorCommon.negativeLocktime); } return operation(state, locktime); }; @@ -74,60 +60,52 @@ const locktimeTypesAreCompatible = ( requiredLocktime >= Constants.locktimeThreshold); export const opCheckLockTimeVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError & { - readonly locktime: number; - readonly sequenceNumber: number; - }, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => (state: State) => - readLocktime( - state, - (nextState, requiredLocktime) => { - if (!locktimeTypesAreCompatible(nextState.locktime, requiredLocktime)) { - return applyError( - AuthenticationErrorCommon.incompatibleLocktimeType, - nextState - ); - } - if (requiredLocktime > nextState.locktime) { - return applyError( - AuthenticationErrorCommon.unsatisfiedLocktime, - nextState - ); - } - if ( - nextState.sequenceNumber === Constants.locktimeDisablingSequenceNumber - ) { - return applyError( - AuthenticationErrorCommon.locktimeDisabled, - nextState - ); - } - return nextState; - }, - flags - ); + State extends AuthenticationProgramStateCommon +>( + state: State +) => + useLocktime(state, (nextState, requiredLocktime) => { + if ( + !locktimeTypesAreCompatible( + nextState.program.transaction.locktime, + requiredLocktime + ) + ) { + return applyError( + nextState, + AuthenticationErrorCommon.incompatibleLocktimeType + ); + } + if (requiredLocktime > nextState.program.transaction.locktime) { + return applyError( + nextState, + AuthenticationErrorCommon.unsatisfiedLocktime + ); + } + const { sequenceNumber } = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + nextState.program.transaction.inputs[nextState.program.inputIndex]!; + if (sequenceNumber === Constants.locktimeDisablingSequenceNumber) { + return applyError(nextState, AuthenticationErrorCommon.locktimeDisabled); + } + return nextState; + }); // eslint-disable-next-line no-bitwise const includesFlag = (value: number, flag: number) => (value & flag) !== 0; export const opCheckSequenceVerify = < - State extends AuthenticationProgramStateStack & - AuthenticationProgramStateError & { - readonly sequenceNumber: number; - readonly version: number; - }, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => (state: State) => - readLocktime( + State extends AuthenticationProgramStateCommon +>( + state: State +) => + useLocktime( state, // eslint-disable-next-line complexity (nextState, requiredSequence) => { + const { sequenceNumber } = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + nextState.program.transaction.inputs[nextState.program.inputIndex]!; const sequenceLocktimeDisabled = includesFlag( requiredSequence, Constants.sequenceLocktimeDisableFlag @@ -137,36 +115,29 @@ export const opCheckSequenceVerify = < } if ( - nextState.version < Constants.sequenceLocktimeTransactionVersionMinimum + nextState.program.transaction.version < + Constants.sequenceLocktimeTransactionVersionMinimum ) { - return applyError( - AuthenticationErrorCommon.checkSequenceUnavailable, - nextState + return applyError( + nextState, + AuthenticationErrorCommon.checkSequenceUnavailable ); } - if ( - includesFlag( - nextState.sequenceNumber, - Constants.sequenceLocktimeDisableFlag - ) - ) { - return applyError( - AuthenticationErrorCommon.unmatchedSequenceDisable, - nextState + if (includesFlag(sequenceNumber, Constants.sequenceLocktimeDisableFlag)) { + return applyError( + nextState, + AuthenticationErrorCommon.unmatchedSequenceDisable ); } if ( includesFlag(requiredSequence, Constants.sequenceLocktimeTypeFlag) !== - includesFlag( - nextState.sequenceNumber, - Constants.sequenceLocktimeTypeFlag - ) + includesFlag(sequenceNumber, Constants.sequenceLocktimeTypeFlag) ) { - return applyError( - AuthenticationErrorCommon.incompatibleSequenceType, - nextState + return applyError( + nextState, + AuthenticationErrorCommon.incompatibleSequenceType ); } @@ -174,30 +145,14 @@ export const opCheckSequenceVerify = < // eslint-disable-next-line no-bitwise (requiredSequence & Constants.sequenceLocktimeMask) > // eslint-disable-next-line no-bitwise - (nextState.sequenceNumber & Constants.sequenceLocktimeMask) + (sequenceNumber & Constants.sequenceLocktimeMask) ) { - return applyError( - AuthenticationErrorCommon.unsatisfiedSequenceNumber, - nextState + return applyError( + nextState, + AuthenticationErrorCommon.unsatisfiedSequenceNumber ); } return nextState; - }, - flags + } ); - -export const timeOperations = < - Opcodes, - State extends AuthenticationProgramStateCommon, - Errors ->(flags: { - requireMinimalEncoding: boolean; -}) => ({ - [OpcodesCommon.OP_CHECKLOCKTIMEVERIFY]: opCheckLockTimeVerify( - flags - ), - [OpcodesCommon.OP_CHECKSEQUENCEVERIFY]: opCheckSequenceVerify( - flags - ), -}); diff --git a/src/lib/vm/instruction-sets/common/types.spec.ts b/src/lib/vm/instruction-sets/common/types.spec.ts index 3fdb2c2f..7624715a 100644 --- a/src/lib/vm/instruction-sets/common/types.spec.ts +++ b/src/lib/vm/instruction-sets/common/types.spec.ts @@ -1,20 +1,18 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers */ import test from 'ava'; import { - bigIntToScriptNumber, + bigIntToVmNumber, binToHex, - booleanToScriptNumber, + booleanToVmNumber, + decodeVmNumber, hexToBin, - parseBytesAsScriptNumber, - ScriptNumberError, stackItemIsTruthy, -} from '../../../lib'; + VmNumberError, +} from '../../../lib.js'; -/** - * Derived from https://github.com/bitcoinjs/bitcoinjs-lib - */ -const minimallyEncodedScriptNumbers: readonly [string, bigint][] = [ +// Derived from https://github.com/bitcoinjs/bitcoinjs-lib +const minimallyEncodedVmNumbers: readonly [string, bigint][] = [ + /* spell-checker:disable */ ['', BigInt(0)], ['01', BigInt(1)], ['02', BigInt(2)], @@ -62,9 +60,10 @@ const minimallyEncodedScriptNumbers: readonly [string, bigint][] = [ ['fd', BigInt(-125)], ['82', BigInt(-2)], ['81', BigInt(-1)], + /* spell-checker:enable */ ]; -const nonMinimallyEncodedScriptNumbers: readonly [string, bigint][] = [ +const nonMinimallyEncodedVmNumbers: readonly [string, bigint][] = [ ['00', BigInt(0)], ['0000', BigInt(0)], ['80', BigInt(0)], @@ -76,35 +75,35 @@ const nonMinimallyEncodedScriptNumbers: readonly [string, bigint][] = [ ['abcdef4280', BigInt(-1123012011)], ]; -const equivalentScriptNumbers: readonly [string, string][] = [ +const equivalentVmNumbers: readonly [string, string][] = [ ['01020380', '010283'], ['0102030480', '01020384'], ['abcdef4280', 'abcdefc2'], ]; -test('parseBytesAsScriptNumber', (t) => { - minimallyEncodedScriptNumbers.map((pair) => { - t.deepEqual(parseBytesAsScriptNumber(hexToBin(pair[0])), pair[1]); +test('decodeVmNumber', (t) => { + minimallyEncodedVmNumbers.map((pair) => { + t.deepEqual(decodeVmNumber(hexToBin(pair[0])), pair[1]); t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { + decodeVmNumber(hexToBin(pair[0]), { requireMinimalEncoding: true, }), pair[1] ); t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { - maximumScriptNumberByteLength: 4, + decodeVmNumber(hexToBin(pair[0]), { + maximumVmNumberByteLength: 4, requireMinimalEncoding: true, }), pair[1] ); return undefined; }); - [...minimallyEncodedScriptNumbers, ...nonMinimallyEncodedScriptNumbers].map( + [...minimallyEncodedVmNumbers, ...nonMinimallyEncodedVmNumbers].map( (pair) => { t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin(pair[0]), { + maximumVmNumberByteLength: 5, requireMinimalEncoding: false, }), pair[1] @@ -112,61 +111,63 @@ test('parseBytesAsScriptNumber', (t) => { return undefined; } ); - nonMinimallyEncodedScriptNumbers.map((pair) => { + nonMinimallyEncodedVmNumbers.map((pair) => { t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin(pair[0]), { + maximumVmNumberByteLength: 5, }), - ScriptNumberError.requiresMinimal + VmNumberError.requiresMinimal ); t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin(pair[0]), { + maximumVmNumberByteLength: 5, requireMinimalEncoding: true, }), - ScriptNumberError.requiresMinimal + VmNumberError.requiresMinimal ); return undefined; }); - equivalentScriptNumbers.map((pair) => { + equivalentVmNumbers.map((pair) => { t.deepEqual( - parseBytesAsScriptNumber(hexToBin(pair[0]), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin(pair[0]), { + maximumVmNumberByteLength: 5, requireMinimalEncoding: false, }), - parseBytesAsScriptNumber(hexToBin(pair[1]), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin(pair[1]), { + maximumVmNumberByteLength: 5, requireMinimalEncoding: true, }) ); return undefined; }); t.deepEqual( - parseBytesAsScriptNumber(hexToBin('abcdef1234')), - ScriptNumberError.outOfRange + decodeVmNumber(hexToBin('abcdef1234'), { + maximumVmNumberByteLength: 4, + }), + VmNumberError.outOfRange ); t.deepEqual( - parseBytesAsScriptNumber(hexToBin('abcdef1234'), { - maximumScriptNumberByteLength: 5, + decodeVmNumber(hexToBin('abcdef1234'), { + maximumVmNumberByteLength: 5, }), BigInt(223656005035) ); }); -test('bigIntToScriptNumber', (t) => { - minimallyEncodedScriptNumbers.map((pair) => { - t.deepEqual(binToHex(bigIntToScriptNumber(pair[1])), pair[0]); +test('bigIntToVmNumber', (t) => { + minimallyEncodedVmNumbers.map((pair) => { + t.deepEqual(binToHex(bigIntToVmNumber(pair[1])), pair[0]); return undefined; }); }); // TODO: more test vectors test('stackElementIsTruthy', (t) => { - t.is(stackItemIsTruthy(bigIntToScriptNumber(BigInt(0))), false); - t.is(stackItemIsTruthy(bigIntToScriptNumber(BigInt(1))), true); + t.is(stackItemIsTruthy(bigIntToVmNumber(BigInt(0))), false); + t.is(stackItemIsTruthy(bigIntToVmNumber(BigInt(1))), true); }); -test('booleanToScriptNumber', (t) => { - t.deepEqual(booleanToScriptNumber(false), bigIntToScriptNumber(BigInt(0))); - t.deepEqual(booleanToScriptNumber(true), bigIntToScriptNumber(BigInt(1))); +test('booleanToVmNumber', (t) => { + t.deepEqual(booleanToVmNumber(false), bigIntToVmNumber(BigInt(0))); + t.deepEqual(booleanToVmNumber(true), bigIntToVmNumber(BigInt(1))); }); diff --git a/src/lib/vm/instruction-sets/common/types.ts b/src/lib/vm/instruction-sets/common/types.ts deleted file mode 100644 index ff259ff3..00000000 --- a/src/lib/vm/instruction-sets/common/types.ts +++ /dev/null @@ -1,178 +0,0 @@ -export enum ScriptNumberError { - outOfRange = 'Failed to parse Script Number: overflows Script Number range.', - requiresMinimal = 'Failed to parse Script Number: the number is not minimally-encoded.', -} - -export const isScriptNumberError = ( - value: BigInt | ScriptNumberError -): value is ScriptNumberError => - value === ScriptNumberError.outOfRange || - value === ScriptNumberError.requiresMinimal; - -const normalMaximumScriptNumberByteLength = 4; - -/** - * This method attempts to parse a "Script Number", a format with which numeric - * values are represented on the stack. (The Satoshi implementation calls this - * `CScriptNum`.) - * - * If `bytes` is a valid Script Number, this method returns the represented - * number in BigInt format. If `bytes` is not valid, a `ScriptNumberError` is - * returned. - * - * All common operations accepting numeric parameters or pushing numeric values - * to the stack currently use the Script Number format. The binary format of - * numbers wouldn't be important if they could only be operated on by arithmetic - * operators, but since the results of these operations may become input to - * other operations (e.g. hashing), the specific representation is consensus- - * critical. - * - * Parsing of Script Numbers is limited to 4 bytes (with the exception of - * OP_CHECKLOCKTIMEVERIFY and OP_CHECKSEQUENCEVERIFY, which read up to 5-bytes). - * The bytes are read as a signed integer (for 32-bits: inclusive range from - * -2^31 + 1 to 2^31 - 1) in little-endian byte order. Script Numbers must - * further be encoded as minimally as possible (no zero-padding). See code/tests - * for details. - * - * @remarks - * Operators may push numeric results to the stack which exceed the current - * 4-byte length limit of Script Numbers. While these stack elements would - * otherwise be valid Script Numbers, because of the 4-byte length limit, they - * can only be used as non-numeric values in later operations. - * - * Most other implementations currently parse Script Numbers into 64-bit - * integers to operate on them (rather than integers of arbitrary size like - * BigInt). Currently, no operators are at risk of overflowing 64-bit integers - * given 32-bit integer inputs, but future operators may require additional - * refactoring in those implementations. - * - * @param bytes - a Uint8Array from the stack - * @param requireMinimalEncoding - if true, this method returns an error when - * parsing non-minimally encoded Script Numbers - * @param maximumScriptNumberByteLength - the maximum valid number of bytes - */ -// eslint-disable-next-line complexity -export const parseBytesAsScriptNumber = ( - bytes: Uint8Array, - { - maximumScriptNumberByteLength = normalMaximumScriptNumberByteLength, - requireMinimalEncoding = true, - }: { - maximumScriptNumberByteLength?: number; - requireMinimalEncoding?: boolean; - } = { - maximumScriptNumberByteLength: normalMaximumScriptNumberByteLength, - requireMinimalEncoding: true, - } -): bigint | ScriptNumberError => { - if (bytes.length === 0) { - return BigInt(0); - } - if (bytes.length > maximumScriptNumberByteLength) { - return ScriptNumberError.outOfRange; - } - const mostSignificantByte = bytes[bytes.length - 1]; - const secondMostSignificantByte = bytes[bytes.length - 1 - 1]; - const allButTheSignBit = 0b1111_111; - const justTheSignBit = 0b1000_0000; - - if ( - requireMinimalEncoding && - // eslint-disable-next-line no-bitwise - (mostSignificantByte & allButTheSignBit) === 0 && - // eslint-disable-next-line no-bitwise - (bytes.length <= 1 || (secondMostSignificantByte & justTheSignBit) === 0) - ) { - return ScriptNumberError.requiresMinimal; - } - - const bitsPerByte = 8; - const signFlippingByte = 0x80; - // eslint-disable-next-line functional/no-let - let result = BigInt(0); - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus - for (let byte = 0; byte < bytes.length; byte++) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise - result |= BigInt(bytes[byte]) << BigInt(byte * bitsPerByte); - } - - /* eslint-disable no-bitwise */ - const isNegative = (bytes[bytes.length - 1] & signFlippingByte) !== 0; - return isNegative - ? -( - result & - ~(BigInt(signFlippingByte) << BigInt(bitsPerByte * (bytes.length - 1))) - ) - : result; - /* eslint-enable no-bitwise */ -}; - -/** - * Convert a BigInt into the "Script Number" format. See - * `parseBytesAsScriptNumber` for more information. - * - * @param integer - the BigInt to encode as a Script Number - */ -// eslint-disable-next-line complexity -export const bigIntToScriptNumber = (integer: bigint): Uint8Array => { - if (integer === BigInt(0)) { - return new Uint8Array(); - } - - const bytes: number[] = []; - const isNegative = integer < 0; - const byteStates = 0xff; - const bitsPerByte = 8; - // eslint-disable-next-line functional/no-let - let remaining = isNegative ? -integer : integer; - // eslint-disable-next-line functional/no-loop-statement - while (remaining > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise - bytes.push(Number(remaining & BigInt(byteStates))); - // eslint-disable-next-line functional/no-expression-statement, no-bitwise - remaining >>= BigInt(bitsPerByte); - } - - const signFlippingByte = 0x80; - // eslint-disable-next-line no-bitwise, functional/no-conditional-statement - if ((bytes[bytes.length - 1] & signFlippingByte) > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - bytes.push(isNegative ? signFlippingByte : 0x00); - // eslint-disable-next-line functional/no-conditional-statement - } else if (isNegative) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise - bytes[bytes.length - 1] |= signFlippingByte; - } - return new Uint8Array(bytes); -}; - -/** - * Returns true if the provided stack item is "truthy" in the sense required - * by several operations (anything but zero and "negative zero"). - * - * The Satoshi implementation calls this method `CastToBool`. - * - * @param item - the stack item to check for truthiness - */ -export const stackItemIsTruthy = (item: Uint8Array) => { - const signFlippingByte = 0x80; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus - for (let i = 0; i < item.length; i++) { - if (item[i] !== 0) { - if (i === item.length - 1 && item[i] === signFlippingByte) { - return false; - } - return true; - } - } - return false; -}; - -/** - * Convert a boolean into Script Number format (the type used to express - * boolean values emitted by several operations). - * - * @param value - the boolean value to convert - */ -export const booleanToScriptNumber = (value: boolean) => - value ? bigIntToScriptNumber(BigInt(1)) : bigIntToScriptNumber(BigInt(0)); diff --git a/src/lib/vm/instruction-sets/instruction-sets-types.ts b/src/lib/vm/instruction-sets/instruction-sets-types.ts deleted file mode 100644 index cd8efa6a..00000000 --- a/src/lib/vm/instruction-sets/instruction-sets-types.ts +++ /dev/null @@ -1,102 +0,0 @@ -export interface AuthenticationInstructionPush { - /** - * The data to be pushed to the stack. - */ - readonly data: Uint8Array; - /** - * The opcode used to push this data. - */ - readonly opcode: Opcodes; -} - -export interface AuthenticationInstructionOperation { - /** - * The opcode of this instruction's operation. - */ - readonly opcode: Opcodes; -} - -/** - * A properly-formed instruction used by an `AuthenticationVirtualMachine`. - */ -export type AuthenticationInstruction = - | AuthenticationInstructionPush - | AuthenticationInstructionOperation; - -export type AuthenticationInstructions< - Opcodes = number -> = AuthenticationInstruction[]; - -type Uint8Bytes = 1; -type Uint16Bytes = 2; -type Uint32Bytes = 4; -export interface ParsedAuthenticationInstructionPushMalformedLength< - Opcodes = number -> { - /** - * The expected number of length bytes (`length.length`) for this `PUSHDATA` operation. - */ - readonly expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; - /** - * The length `Uint8Array` provided. This instruction is malformed because the length of this `Uint8Array` is shorter than the `expectedLengthBytes`. - */ - readonly length: Uint8Array; - readonly malformed: true; - readonly opcode: Opcodes; -} - -export interface ParsedAuthenticationInstructionPushMalformedData< - Opcodes = number -> { - /** - * The data `Uint8Array` provided. This instruction is malformed because the length of this `Uint8Array` is shorter than the `expectedDataBytes`. - */ - readonly data: Uint8Array; - /** - * The expected number of data bytes (`data.length`) for this push operation. - */ - readonly expectedDataBytes: number; - readonly malformed: true; - readonly opcode: Opcodes; -} - -export type ParsedAuthenticationInstructionMalformed = - | ParsedAuthenticationInstructionPushMalformedLength - | ParsedAuthenticationInstructionPushMalformedData; - -/** - * A potentially-malformed `AuthenticationInstruction`. If `malformed` is - * `true`, this could be either - * `ParsedAuthenticationInstructionPushMalformedLength` or - * `ParsedAuthenticationInstructionPushMalformedData` - * - * If the final instruction is a push operation which requires more bytes than - * are available in the remaining portion of a serialized script, that - * instruction will have a `malformed` property with a value of `true`. - * . - */ -export type ParsedAuthenticationInstruction = - | AuthenticationInstruction - | ParsedAuthenticationInstructionMalformed; - -/** - * An array of authentication instructions which may end with a malformed - * instruction. - * - * **Implementation note**: this type can be improved by only marking the final - * element as potentially malformed. This is waiting on: - * https://github.com/Microsoft/TypeScript/issues/1360 - * - * The following type can be used when it doesn't produce the error, - * `A rest element must be last in a tuple type. [1256]`: - * ```ts - * export type ParsedAuthenticationInstructions = [ - * ...AuthenticationInstruction, - * ParsedAuthenticationInstruction - * ]; - * ``` - */ -export type ParsedAuthenticationInstructions = ( - | AuthenticationInstruction - | ParsedAuthenticationInstruction -)[]; diff --git a/src/lib/vm/instruction-sets/instruction-sets-utils.ts b/src/lib/vm/instruction-sets/instruction-sets-utils.ts deleted file mode 100644 index 43495e8f..00000000 --- a/src/lib/vm/instruction-sets/instruction-sets-utils.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { - binToHex, - flattenBinArray, - numberToBinUint16LE, - numberToBinUint32LE, -} from '../../format/format'; -import { createCompilerCommonSynchronous } from '../../template/compiler'; -import { AuthenticationProgramStateCommon } from '../vm-types'; - -import { AuthenticationErrorBCH, OpcodesBCH } from './bch/bch'; -import { OpcodesBTC } from './btc/btc'; -import { - AuthenticationInstruction, - AuthenticationInstructionPush, - ParsedAuthenticationInstruction, - ParsedAuthenticationInstructionMalformed, - ParsedAuthenticationInstructionPushMalformedLength, - ParsedAuthenticationInstructions, -} from './instruction-sets-types'; - -/** - * A type-guard which checks if the provided instruction is malformed. - * @param instruction - the instruction to check - */ -export const authenticationInstructionIsMalformed = ( - instruction: ParsedAuthenticationInstruction -): instruction is ParsedAuthenticationInstructionMalformed => - 'malformed' in instruction; - -/** - * A type-guard which checks if the final instruction in the provided array of - * instructions is malformed. (Only the final instruction can be malformed.) - * @param instruction - the array of instructions to check - */ -export const authenticationInstructionsAreMalformed = ( - instructions: ParsedAuthenticationInstructions -): instructions is ParsedAuthenticationInstructionMalformed[] => - instructions.length > 0 && - authenticationInstructionIsMalformed(instructions[instructions.length - 1]); - -/** - * A type-guard which confirms that the final instruction in the provided array - * is not malformed. (Only the final instruction can be malformed.) - * @param instruction - the array of instructions to check - */ -export const authenticationInstructionsAreNotMalformed = ( - instructions: ParsedAuthenticationInstructions -): instructions is AuthenticationInstruction[] => - !authenticationInstructionsAreMalformed(instructions); - -enum CommonPushOpcodes { - OP_0 = 0x00, - OP_PUSHDATA_1 = 0x4c, - OP_PUSHDATA_2 = 0x4d, - OP_PUSHDATA_4 = 0x4e, -} - -const uint8Bytes = 1; -const uint16Bytes = 2; -const uint32Bytes = 4; - -const readLittleEndianNumber = ( - script: Uint8Array, - index: number, - length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes -) => { - const view = new DataView(script.buffer, index, length); - const readAsLittleEndian = true; - return length === uint8Bytes - ? view.getUint8(0) - : length === uint16Bytes - ? view.getUint16(0, readAsLittleEndian) - : view.getUint32(0, readAsLittleEndian); -}; - -/** - * Returns the number of bytes used to indicate the length of the push in this - * operation. - * @param opcode - an opcode between 0x00 and 0x4e - */ -export const lengthBytesForPushOpcode = (opcode: number) => - opcode < CommonPushOpcodes.OP_PUSHDATA_1 - ? 0 - : opcode === CommonPushOpcodes.OP_PUSHDATA_1 - ? uint8Bytes - : opcode === CommonPushOpcodes.OP_PUSHDATA_2 - ? uint16Bytes - : uint32Bytes; - -/** - * Parse one instruction from the provided script. - * - * Returns an object with an `instruction` referencing a - * `ParsedAuthenticationInstruction`, and a `nextIndex` indicating the next - * index from which to read. If the next index is greater than or equal to the - * length of the script, the script has been fully parsed. - * - * The final `ParsedAuthenticationInstruction` from a serialized script may be - * malformed if 1) the final operation is a push and 2) too few bytes remain for - * the push operation to complete. - * - * @param script - the script from which to read the next instruction - * @param index - the offset from which to begin reading - */ -// eslint-disable-next-line complexity -export const readAuthenticationInstruction = ( - script: Uint8Array, - index: number -): { - instruction: ParsedAuthenticationInstruction; - nextIndex: number; -} => { - const opcode = script[index]; - if (opcode > CommonPushOpcodes.OP_PUSHDATA_4) { - return { - instruction: { - opcode: (opcode as unknown) as Opcodes, - }, - nextIndex: index + 1, - }; - } - const lengthBytes = lengthBytesForPushOpcode(opcode); - - if (lengthBytes !== 0 && index + lengthBytes >= script.length) { - const sliceStart = index + 1; - const sliceEnd = sliceStart + lengthBytes; - return { - instruction: { - expectedLengthBytes: lengthBytes, - length: script.slice(sliceStart, sliceEnd), - malformed: true, - opcode: (opcode as unknown) as Opcodes, - }, - nextIndex: sliceEnd, - }; - } - - const dataBytes = - lengthBytes === 0 - ? opcode - : readLittleEndianNumber(script, index + 1, lengthBytes); - const dataStart = index + 1 + lengthBytes; - const dataEnd = dataStart + dataBytes; - return { - instruction: { - data: script.slice(dataStart, dataEnd), - ...(dataEnd > script.length - ? { - expectedDataBytes: dataEnd - dataStart, - malformed: true, - } - : undefined), - opcode: (opcode as unknown) as Opcodes, - }, - nextIndex: dataEnd, - }; -}; - -/** - * Parse authentication bytecode (`lockingBytecode` or `unlockingBytecode`) - * into `ParsedAuthenticationInstructions`. The method - * `authenticationInstructionsAreMalformed` can be used to check if these - * instructions include a malformed instruction. If not, they are valid - * `AuthenticationInstructions`. - * - * This implementation is common to most bitcoin forks, but the type parameter - * can be used to strongly type the resulting instructions. For example: - * - * ```js - * const instructions = parseAuthenticationBytecode(script); - * ``` - * - * @param script - the serialized script to parse - */ -export const parseBytecode = (script: Uint8Array) => { - const instructions: ParsedAuthenticationInstructions = []; - // eslint-disable-next-line functional/no-let - let i = 0; - // eslint-disable-next-line functional/no-loop-statement - while (i < script.length) { - const { instruction, nextIndex } = readAuthenticationInstruction( - script, - i - ); - // eslint-disable-next-line functional/no-expression-statement - i = nextIndex; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data - instructions.push(instruction); - } - return instructions; -}; - -/** - * OP_0 is the only single-word push. All other push instructions will - * disassemble to multiple ASM words. (OP_1-OP_16 are handled like normal - * operations.) - */ -const isMultiWordPush = (opcode: number) => opcode !== CommonPushOpcodes.OP_0; -const formatAsmPushHex = (data: Uint8Array) => - data.length > 0 ? `0x${binToHex(data)}` : ''; -const formatMissingBytesAsm = (missing: number) => - `[missing ${missing} byte${missing === 1 ? '' : 's'}]`; -const hasMalformedLength = ( - instruction: ParsedAuthenticationInstructionMalformed -): instruction is ParsedAuthenticationInstructionPushMalformedLength => - 'length' in instruction; -const isPushData = (pushOpcode: number) => - pushOpcode >= CommonPushOpcodes.OP_PUSHDATA_1; - -/** - * Disassemble a malformed authentication instruction into a string description. - * @param opcodes - a mapping of possible opcodes to their string representation - * @param instruction - the malformed instruction to disassemble - */ -export const disassembleParsedAuthenticationInstructionMalformed = < - Opcodes = number ->( - opcodes: { readonly [opcode: number]: string }, - instruction: ParsedAuthenticationInstructionMalformed -): string => - `${opcodes[(instruction.opcode as unknown) as number]} ${ - hasMalformedLength(instruction) - ? `${formatAsmPushHex(instruction.length)}${formatMissingBytesAsm( - instruction.expectedLengthBytes - instruction.length.length - )}` - : `${ - isPushData((instruction.opcode as unknown) as number) - ? `${instruction.expectedDataBytes} ` - : '' - }${formatAsmPushHex(instruction.data)}${formatMissingBytesAsm( - instruction.expectedDataBytes - instruction.data.length - )}` - }`; - -/** - * Disassemble a properly-formed authentication instruction into a string - * description. - * @param opcodes - a mapping of possible opcodes to their string representation - * @param instruction - the instruction to disassemble - */ -export const disassembleAuthenticationInstruction = ( - opcodes: { readonly [opcode: number]: string }, - instruction: AuthenticationInstruction -): string => - `${opcodes[(instruction.opcode as unknown) as number]}${ - 'data' in instruction && - isMultiWordPush((instruction.opcode as unknown) as number) - ? ` ${ - isPushData((instruction.opcode as unknown) as number) - ? `${instruction.data.length} ` - : '' - }${formatAsmPushHex(instruction.data)}` - : '' - }`; - -/** - * Disassemble a single `ParsedAuthenticationInstruction` (includes potentially - * malformed instructions) into its ASM representation. - * - * @param script - the instruction to disassemble - */ -export const disassembleParsedAuthenticationInstruction = ( - opcodes: { readonly [opcode: number]: string }, - instruction: ParsedAuthenticationInstruction -): string => - authenticationInstructionIsMalformed(instruction) - ? disassembleParsedAuthenticationInstructionMalformed( - opcodes, - instruction - ) - : disassembleAuthenticationInstruction(opcodes, instruction); - -/** - * Disassemble an array of `ParsedAuthenticationInstructions` (including - * potentially malformed instructions) into its ASM representation. - * - * @param script - the array of instructions to disassemble - */ -export const disassembleParsedAuthenticationInstructions = ( - opcodes: { readonly [opcode: number]: string }, - instructions: readonly ParsedAuthenticationInstruction[] -): string => - instructions - .map((instruction) => - disassembleParsedAuthenticationInstruction(opcodes, instruction) - ) - .join(' '); - -/** - * Disassemble authentication bytecode into a lossless ASM representation. (All - * push operations are represented with the same opcodes used in the bytecode, - * even when non-minimally encoded.) - * - * @param opcodes - the set to use when determining the name of opcodes, e.g. `OpcodesBCH` - * @param bytecode - the authentication bytecode to disassemble - */ -export const disassembleBytecode = ( - opcodes: { readonly [opcode: number]: string }, - bytecode: Uint8Array -) => - disassembleParsedAuthenticationInstructions( - opcodes, - parseBytecode(bytecode) - ); - -/** - * Disassemble BCH authentication bytecode into its ASM representation. - * @param bytecode - the authentication bytecode to disassemble - */ -export const disassembleBytecodeBCH = (bytecode: Uint8Array) => - disassembleParsedAuthenticationInstructions( - OpcodesBCH, - parseBytecode(bytecode) - ); - -/** - * Disassemble BTC authentication bytecode into its ASM representation. - * @param bytecode - the authentication bytecode to disassemble - */ -export const disassembleBytecodeBTC = (bytecode: Uint8Array) => - disassembleParsedAuthenticationInstructions( - OpcodesBTC, - parseBytecode(bytecode) - ); - -/** - * Create an object where each key is an opcode identifier and each value is - * the bytecode value (`Uint8Array`) it represents. - * @param opcodes - An opcode enum, e.g. `OpcodesBCH` - */ -export const generateBytecodeMap = (opcodes: Record) => - Object.entries(opcodes) - .filter<[string, number]>( - (entry): entry is [string, number] => typeof entry[1] === 'number' - ) - .reduce<{ - [opcode: string]: Uint8Array; - }>( - (identifiers, pair) => ({ - ...identifiers, - [pair[0]]: Uint8Array.of(pair[1]), - }), - {} - ); - -/** - * Re-assemble a string of disassembled bytecode (see `disassembleBytecode`). - * - * @param opcodes - a mapping of opcodes to their respective Uint8Array - * representation - * @param disassembledBytecode - the disassembled bytecode to re-assemble - */ -export const assembleBytecode = < - Opcodes extends number = OpcodesBCH, - Errors = AuthenticationErrorBCH ->( - opcodes: { readonly [opcode: string]: Uint8Array }, - disassembledBytecode: string -) => { - const environment = { - opcodes, - scripts: { asm: disassembledBytecode }, - }; - return createCompilerCommonSynchronous< - typeof environment, - AuthenticationProgramStateCommon, - Opcodes, - Errors - >(environment).generateBytecode('asm', {}); -}; - -/** - * Re-assemble a string of disassembled BCH bytecode (see - * `disassembleBytecodeBCH`). - * - * Note, this method performs automatic minimization of push instructions. - * - * @param disassembledBytecode - the disassembled BCH bytecode to re-assemble - */ -export const assembleBytecodeBCH = (disassembledBytecode: string) => - assembleBytecode(generateBytecodeMap(OpcodesBCH), disassembledBytecode); - -/** - * Re-assemble a string of disassembled BCH bytecode (see - * `disassembleBytecodeBTC`). - * - * Note, this method performs automatic minimization of push instructions. - * - * @param disassembledBytecode - the disassembled BTC bytecode to re-assemble - */ -export const assembleBytecodeBTC = (disassembledBytecode: string) => - assembleBytecode( - generateBytecodeMap(OpcodesBTC), - disassembledBytecode - ); - -const getInstructionLengthBytes = ( - instruction: AuthenticationInstructionPush -) => { - const opcode = (instruction.opcode as unknown) as number; - const expectedLength = lengthBytesForPushOpcode(opcode); - return expectedLength === uint8Bytes - ? Uint8Array.of(instruction.data.length) - : expectedLength === uint16Bytes - ? numberToBinUint16LE(instruction.data.length) - : numberToBinUint32LE(instruction.data.length); -}; - -/** - * Re-serialize a valid authentication instruction. - * @param instruction - the instruction to serialize - */ -export const serializeAuthenticationInstruction = ( - instruction: AuthenticationInstruction -) => - Uint8Array.from([ - (instruction.opcode as unknown) as number, - ...('data' in instruction - ? [ - ...(isPushData((instruction.opcode as unknown) as number) - ? getInstructionLengthBytes(instruction) - : []), - ...instruction.data, - ] - : []), - ]); - -/** - * Re-serialize a malformed authentication instruction. - * @param instruction - the malformed instruction to serialize - */ -export const serializeParsedAuthenticationInstructionMalformed = < - Opcodes = number ->( - instruction: ParsedAuthenticationInstructionMalformed -) => { - const opcode = (instruction.opcode as unknown) as number; - - if (hasMalformedLength(instruction)) { - return Uint8Array.from([opcode, ...instruction.length]); - } - - if (isPushData(opcode)) { - return Uint8Array.from([ - opcode, - ...(opcode === CommonPushOpcodes.OP_PUSHDATA_1 - ? Uint8Array.of(instruction.expectedDataBytes) - : opcode === CommonPushOpcodes.OP_PUSHDATA_2 - ? numberToBinUint16LE(instruction.expectedDataBytes) - : numberToBinUint32LE(instruction.expectedDataBytes)), - ...instruction.data, - ]); - } - - return Uint8Array.from([opcode, ...instruction.data]); -}; - -/** - * Re-serialize a potentially-malformed authentication instruction. - * @param instruction - the potentially-malformed instruction to serialize - */ -export const serializeParsedAuthenticationInstruction = ( - instruction: ParsedAuthenticationInstruction -): Uint8Array => - authenticationInstructionIsMalformed(instruction) - ? serializeParsedAuthenticationInstructionMalformed(instruction) - : serializeAuthenticationInstruction(instruction); - -/** - * Re-serialize an array of valid authentication instructions. - * @param instructions - the array of valid instructions to serialize - */ -export const serializeAuthenticationInstructions = ( - instructions: readonly AuthenticationInstruction[] -) => flattenBinArray(instructions.map(serializeAuthenticationInstruction)); - -/** - * Re-serialize an array of potentially-malformed authentication instructions. - * @param instructions - the array of instructions to serialize - */ -export const serializeParsedAuthenticationInstructions = ( - instructions: readonly ParsedAuthenticationInstruction[] -) => - flattenBinArray(instructions.map(serializeParsedAuthenticationInstruction)); diff --git a/src/lib/vm/instruction-sets/instruction-sets.ts b/src/lib/vm/instruction-sets/instruction-sets.ts index 7592d997..67acb16c 100644 --- a/src/lib/vm/instruction-sets/instruction-sets.ts +++ b/src/lib/vm/instruction-sets/instruction-sets.ts @@ -1,5 +1,4 @@ -export * from './btc/btc'; -export * from './bch/bch'; -export * from './common/common'; -export * from './instruction-sets-utils'; -export * from './instruction-sets-types'; +export * from './bch/2021/bch-2021.js'; +export * from './bch/2022/bch-2022.js'; +export * from './btc/btc.js'; +export * from './common/common.js'; diff --git a/src/lib/vm/instruction-sets/readme.md b/src/lib/vm/instruction-sets/readme.md new file mode 100644 index 00000000..72d4f158 --- /dev/null +++ b/src/lib/vm/instruction-sets/readme.md @@ -0,0 +1,34 @@ +# Libauth Instruction Sets + +This directory contains all of Libauth's supported instruction sets. + +Functionality that is shared among multiple instruction sets is typically included in the `common` directory, and VM-specific functionality is included in each respective VM directory. + +## Copy, Don't Complicate + +**While most of Libauth attempts to be DRY (Don't Repeat Yourself), instruction sets need not follow this approach.** + +If an upgrade proposal requires adding a new code path within a `common` operation, **resist the urge to add flags to the operation**. Instead, copy the operation into the instruction set's directory and modify it there. + +Libauth instruction sets should be as clearly defined and readable as possible, ideally within a single `CODE-instruction-set.ts` file. While short-lived instruction sets may be defined by slightly extending an existing, similar instruction set (e.g. a proposed network upgrade or a close relative from a recent network split), VMs intended for long-term support in Libauth should usually have a single-file definition for readability. + +These single-file instruction set files should generally only import operations from sibling files and the `common` directory. + +## Virtual Machine Support + +Libauth aims to provide support for the Virtual Machine (VM) used by every public bitcoin-like network and for public upgrade proposals with stable technical specifications. + +Where multiple VMs include similar functionality, **Libauth's exported utilities should prefer the configuration used by the latest version of the Bitcoin Cash (BCH) VM**. + +When a pending upgrade specification for BCH has wide consensus and a well-established activation date, Libauth utilities may be upgraded prior to the new specification's mainnet activation. + +If a proposed upgrade seems likely to cause a network split, Libauth will attempt to support both sides and may wait to select the next default VM until after the split occurs (or the disagreement is resolved). + +## Virtual Machine Deprecation + +Generally, Libauth only maintains support for active VM versions. For example, `BCH_2019_05` was an upgrade that: + +- enabled Schnorr signature support in `OP_CHECKSIG` and `OP_CHECKDATASIG` +- added a clean-stack exception for SegWit recovery + +The `BCH_2019_05` VM version was replaced without a network split by the `BCH_2019_11` upgrade, meaning `BCH_2019_05` is no longer in use by any public network. As such, relevant code paths, flags, and other VM-specific functionality for `BCH_2019_05` have been removed to simplify Libauth's code. (Of course, historical implementations will always remain available in the Git history and previously-released versions of Libauth.) diff --git a/src/lib/vm/virtual-machine.spec.ts b/src/lib/vm/virtual-machine.spec.ts index c5d28619..7d68e708 100644 --- a/src/lib/vm/virtual-machine.spec.ts +++ b/src/lib/vm/virtual-machine.spec.ts @@ -1,37 +1,45 @@ -/* eslint-disable functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/immutable-data */ import test from 'ava'; -import { +import type { AuthenticationInstruction, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, - createAuthenticationVirtualMachine, InstructionSet, } from '../lib'; +import { createAuthenticationVirtualMachine } from '../lib.js'; -enum SimpleOps { +import { applyError } from './vm.js'; + +const enum SimpleOps { OP_0 = 0, OP_INCREMENT = 1, OP_DECREMENT = 2, OP_ADD = 3, } -enum SimpleError { +const enum SimpleError { UNDEFINED = 'The program called an undefined opcode.', EMPTY_STACK = 'The program tried to pop from an empty stack.', + EXCESSIVE = 'Values may be no larger than 2.', + FAIL = 'The top stack item must be a 1.', +} + +interface SimpleResolvedTransaction { + transaction: { instructions: readonly AuthenticationInstruction[] }; } interface SimpleProgram { - instructions: readonly AuthenticationInstruction[]; + instructions: readonly AuthenticationInstruction[]; } interface SimpleProgramState extends AuthenticationProgramStateMinimum, AuthenticationProgramStateStack { - error?: SimpleError; + error?: string; } const simpleInstructionSet: InstructionSet< + SimpleResolvedTransaction, SimpleProgram, SimpleProgramState > = { @@ -47,6 +55,10 @@ const simpleInstructionSet: InstructionSet< const internalState = { ip: 0, stack: [] }; return stateEvaluate({ ...internalState, ...program }); }, + every: (state) => + (state.stack[state.stack.length - 1] ?? 0) > 2 + ? applyError(state, SimpleError.EXCESSIVE) + : state, operations: { [SimpleOps.OP_0]: (state) => { state.stack.push(0); @@ -81,19 +93,29 @@ const simpleInstructionSet: InstructionSet< return state; }, }, + success: (state) => + state.error === undefined + ? state.stack[state.stack.length - 1] === 1 + ? true + : SimpleError.FAIL + : state.error, undefined: (state) => { state.error = SimpleError.UNDEFINED; return state; }, - verify: (state) => - state.stack[state.stack.length - 1] === 1 - ? true - : 'The top stack item must be a 1.', + verify: (resolvedTransaction, evaluate, success) => { + const result = success( + evaluate({ + instructions: resolvedTransaction.transaction.instructions, + }) + ); + return typeof result === 'string' ? result : true; + }, }; const vm = createAuthenticationVirtualMachine(simpleInstructionSet); -const instructions: readonly AuthenticationInstruction[] = [ +const instructions: readonly AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_INCREMENT }, @@ -102,6 +124,20 @@ const instructions: readonly AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_ADD }, ]; +const instructionsFail1: readonly AuthenticationInstruction[] = [ + { opcode: SimpleOps.OP_0 }, + { opcode: SimpleOps.OP_DECREMENT }, +]; + +const instructionsFail2: readonly AuthenticationInstruction[] = [ + { opcode: SimpleOps.OP_0 }, + { opcode: SimpleOps.OP_INCREMENT }, + { opcode: SimpleOps.OP_INCREMENT }, + { opcode: SimpleOps.OP_INCREMENT }, + { opcode: SimpleOps.OP_DECREMENT }, + { opcode: SimpleOps.OP_DECREMENT }, +]; + test('vm.evaluate with a simple instruction set', (t) => { t.deepEqual(vm.evaluate({ instructions }), { instructions, @@ -123,6 +159,54 @@ test('vm.debug with a simple instruction set', (t) => { ]); }); +test('vm.debug with a simple instruction set (failure 1)', (t) => { + t.deepEqual(vm.debug({ instructions: instructionsFail1 }), [ + { instructions: instructionsFail1, ip: 0, stack: [] }, + { instructions: instructionsFail1, ip: 1, stack: [0] }, + { instructions: instructionsFail1, ip: 2, stack: [-1] }, + { instructions: instructionsFail1, ip: 2, stack: [-1] }, + ]); +}); + +test('vm.debug with a simple instruction set (failure 2)', (t) => { + t.deepEqual(vm.debug({ instructions: instructionsFail2 }), [ + { instructions: instructionsFail2, ip: 0, stack: [] }, + { instructions: instructionsFail2, ip: 1, stack: [0] }, + { instructions: instructionsFail2, ip: 2, stack: [1] }, + { instructions: instructionsFail2, ip: 3, stack: [2] }, + { + error: SimpleError.EXCESSIVE, + instructions: instructionsFail2, + ip: 4, + stack: [3], + }, + { + error: SimpleError.EXCESSIVE, + instructions: instructionsFail2, + ip: 4, + stack: [3], + }, + ]); +}); + +test('vm.verify with a simple instruction set (success)', (t) => { + t.deepEqual(vm.verify({ transaction: { instructions } }), true); +}); + +test('vm.verify with a simple instruction set (failure 1)', (t) => { + t.deepEqual( + vm.verify({ transaction: { instructions: instructionsFail1 } }), + SimpleError.FAIL + ); +}); + +test('vm.verify with a simple instruction set (failure 2)', (t) => { + t.deepEqual( + vm.verify({ transaction: { instructions: instructionsFail2 } }), + SimpleError.EXCESSIVE + ); +}); + test('vm.stateDebug with a simple instruction set', (t) => { t.deepEqual(vm.stateDebug({ instructions, ip: 0, stack: [] }), [ { instructions, ip: 0, stack: [] }, @@ -152,3 +236,25 @@ test('vm.stateStepMutate does not clone (mutating the original state)', (t) => { t.deepEqual(vm.stateStepMutate(changed), { instructions, ip: 6, stack: [1] }); t.deepEqual(changed, { instructions, ip: 6, stack: [1] }); }); + +test('vm.stateSuccess is available', (t) => { + t.deepEqual( + vm.stateSuccess({ instructions: instructionsFail1, ip: 0, stack: [2] }), + SimpleError.FAIL + ); +}); + +test('vm.stateClone is available', (t) => { + t.deepEqual( + vm.stateClone({ + instructions, + ip: 0, + stack: [1, 2, 3], + }), + { + instructions, + ip: 0, + stack: [1, 2, 3], + } + ); +}); diff --git a/src/lib/vm/virtual-machine.ts b/src/lib/vm/virtual-machine.ts index c4a69dd1..e95222dd 100644 --- a/src/lib/vm/virtual-machine.ts +++ b/src/lib/vm/virtual-machine.ts @@ -1,19 +1,23 @@ -import { range } from '../format/format'; - -import { AuthenticationProgramStateBCH } from './instruction-sets/instruction-sets'; -import { AuthenticationProgramStateMinimum } from './vm-types'; +import { range } from '../format/format.js'; +import type { + AuthenticationProgramCommon, + AuthenticationProgramStateCommon, + AuthenticationProgramStateMinimum, + ResolvedTransactionCommon, +} from '../lib'; /** - * Operations define the behavior of an opcode in an `InstructionSet`. + * Operations define the behavior of an opcode in an {@link InstructionSet}. * * Operations should be written as efficiently as possible, and may safely - * mutate the `ProgramState`. If needed, the `AuthenticationVirtualMachine` - * will clone the `ProgramState` before providing it to an operation. + * mutate the `ProgramState`. If needed, the + * {@link AuthenticationVirtualMachine} will clone the `ProgramState` before + * providing it to an operation. */ export type Operation = (state: ProgramState) => ProgramState; /** - * Test a program state, returning an error message + * Test a program state, returning an error message. */ export type TestState = (state: ProgramState) => string | true; export interface InstructionSetOperationMapping { @@ -21,27 +25,30 @@ export interface InstructionSetOperationMapping { } /** - * An `InstructionSet` is a mapping of methods which define the operation of - * an `AuthenticationVirtualMachine`. An instruction set is specific to a - * single consensus setting of a single network, e.g. `BCH_2019_05_Mandatory`, `BCH_2019_05_Standard` or `BTC_2017_08_Mandatory`. + * An {@link InstructionSet} is a mapping of methods that define the operation + * of an {@link AuthenticationVirtualMachine}. * - * An instruction set is composed of `Operation`s which take a `ProgramState` - * and return a `ProgramState`, as well as the `clone`, `continue`, `evaluate`, - * and `verify` "lifecycle" methods. + * An instruction set is composed of {@link Operation}s that take a + * `ProgramState` and return a `ProgramState`, as well as several instruction + * set "lifecycle" methods. * * Each operation is assigned to its `opcode` number (between 0 and 255). When - * evaluating instructions, the virtual machine will select an Operation based - * on its opcode. Any opcodes which are unassigned by the instruction set will - * use the `undefined` operation. + * evaluating instructions, the virtual machine will select an {@link Operation} + * based on its opcode. Any opcodes that are unassigned by the instruction set + * will use the `undefined` operation. */ -export interface InstructionSet { +export interface InstructionSet< + ResolvedTransaction, + AuthenticationProgram, + ProgramState +> { /** * Take a `ProgramState` and return a new copy of that `ProgramState`. * * @remarks * This method is used internally by `stateEvaluate`, `stateStep`, and - * `stateDebug` to prevent the `AuthenticationVirtualMachine` from mutating an - * input when mutation is not desirable. + * `stateDebug` to prevent the {@link AuthenticationVirtualMachine} from + * mutating an input when mutation is not desirable. */ clone: Operation; @@ -49,32 +56,35 @@ export interface InstructionSet { * Test the ProgramState to determine if execution should continue. * * @remarks - * This method is used internally by the `AuthenticationVirtualMachine`'s - * `stateEvaluate` and `stateDebug` methods after each operation, and should - * usually test for errors or program completion. This method is exposed via - * the `AuthenticationVirtualMachine`'s `stateContinue` method. + * This method is used internally by the + * {@link AuthenticationVirtualMachine}'s `stateEvaluate` and `stateDebug` + * methods after each operation, and should usually test for errors or program + * completion. This method is exposed via the + * {@link AuthenticationVirtualMachine}'s `stateContinue` method. */ - // eslint-disable-next-line functional/no-mixed-type + continue: (state: ProgramState) => boolean; /** - * Evaluate a program to completion given the `AuthenticationVirtualMachine`'s - * `stateEvaluate` method. + * Evaluate a program to completion given the + * {@link AuthenticationVirtualMachine}'s `stateEvaluate` method. * * @remarks - * Each `AuthenticationVirtualMachine` can have precise operation requirements - * modifying the ways in which `AuthenticationProgram`s and `ProgramState`s - * are interpreted. (In the C++ implementations, these requirements are - * encoded in `VerifyScript`, and can significantly modify the semantics of - * the basic `EvalScript` system.) + * Each {@link AuthenticationVirtualMachine} can have precise operation + * requirements modifying the ways in which `AuthenticationProgram`s and + * `ProgramState`s are interpreted. (In the C++ implementations, these + * requirements are encoded in `VerifyScript`, and can significantly modify + * the behavior of the basic `EvalScript` system.) For example, the secondary + * evaluation step required for P2SH can be performed in this method. * - * This method is used internally by the `AuthenticationVirtualMachine`'s - * `evaluate` and `debug` methods. It should perform any necessary operations - * and validations before returning a fully-evaluated `ProgramState`. + * This method is used internally by the + * {@link AuthenticationVirtualMachine}'s `evaluate` and `debug` methods. It + * should perform any necessary operations and validations before returning a + * fully-evaluated `ProgramState`. * * @privateRemarks * When using the `debug` method, the `stateEvaluate` parameter is given a - * a modified `stateDebug` which shares the same method signature as + * a modified `stateDebug` that shares the same method signature as * `stateEvaluate` but saves intermediate states for use in the returned * array. When the method returns, the last `ProgramState` is added to the * array of saved intermediate states, and the full array is returned. This @@ -90,12 +100,20 @@ export interface InstructionSet { stateEvaluate: (state: Readonly) => ProgramState ) => ProgramState; + /** + * An optional operation to be performed after every executed virtual machine + * operation. This is useful for implementing logic that is common to all + * operations, e.g. stack depth or memory usage, operation count, etc. + */ + every?: Operation; + /** * A mapping of `opcode` numbers (between 0 and 255) to `Operations`. When the - * `AuthenticationVirtualMachine` encounters an instruction for the specified - * `opcode`, the program state will be passed to the specified operation. + * {@link AuthenticationVirtualMachine} encounters an instruction for the + * specified `opcode`, the program state will be passed to the + * specified operation. */ - // eslint-disable-next-line functional/no-mixed-type + operations: InstructionSetOperationMapping; /** @@ -107,21 +125,43 @@ export interface InstructionSet { undefined: Operation; /** - * Verify a program state has completed evaluation successfully. + * Verify that a program state has completed evaluation successfully. * * @remarks * This method should return `true` if the evaluation was successful, or * an error message on failure. */ - // eslint-disable-next-line functional/no-mixed-type - verify: (state: ProgramState) => string | true; + + success: (state: ProgramState) => string | true; + + /** + * Verify a transaction given the {@link InstructionSet}'s `evaluate` and + * `success` methods and a fully-resolved transaction (e.g. the decoded + * transaction and an array of the outputs spent by its inputs). + * + * This method should perform all possible stateless transaction validation + * but should not attempt to perform any kinds of network state-sensitive + * validation (ensuring source outputs remain unspent, validating claimed + * absolute or relative locktime values against current network conditions, + * etc.), as such results could not be safely cached. + * + * @remarks + * This method should return `true` if the transaction is valid, or an array + * of error messages on failure. + */ + verify: ( + resolvedTransaction: ResolvedTransaction, + evaluate: (program: Readonly) => ProgramState, + success: (state: ProgramState) => string | true + ) => string | true; } /** - * A set of pure-functions allowing authentication programs to be evaluated and - * inspected. + * A set of pure-functions allowing transactions and their authentication + * programs to be evaluated and inspected. */ export interface AuthenticationVirtualMachine< + ResolvedTransaction, AuthenticationProgram, ProgramState > { @@ -131,11 +171,11 @@ export interface AuthenticationVirtualMachine< * in the returned array is the initial program state, and the last * `ProgramState` in the returned array is the result of the evaluation. * - * Note, If the virtual machine is multi-phasic (as is the case with all - * bitcoin forks), the initial program state at the start of of each phase - * will appear in the debug trace. For example, all inputs in all bitcoin - * forks use at least two phases 1) the unlocking phase 2) the locking - * phase. Inputs which match the P2SH format perform a third P2SH phase. Other + * Note, If the virtual machine is multi-phasic (as is the case with all known + * bitcoin forks due to P2SH), the initial program state at the start of each + * phase will appear in the debug trace. For example, all inputs in all + * bitcoin forks use at least two phases 1) the unlocking phase 2) the locking + * phase. Inputs that match the P2SH format perform a third P2SH phase. Other * virtual machines may include different phases (e.g. the SegWit phase in * BTC). For each phase performed, the count of program states in the final * debug trace will increase by one, even if the phase includes no @@ -143,7 +183,7 @@ export interface AuthenticationVirtualMachine< * * @remarks * Even for simple virtual machines, this method includes one final program - * state in addition to the output which would otherwise be produced by + * state in addition to the output that would otherwise be produced by * `stateDebug`. This occurs because the `evaluate` method of the instruction * set must return one final program state after `stateContinue` has produced * a `false`. Often, this is cloned from the previous program state, but it @@ -153,17 +193,22 @@ export interface AuthenticationVirtualMachine< * "duplicate"**: it is the finalized result of the complete virtual machine * evaluation. * - * @param state - the `AuthenticationProgram` to debug + * @param state - the {@link AuthenticationProgram} to debug */ debug: (program: Readonly) => ProgramState[]; /** * Fully evaluate a program, returning the resulting `ProgramState`. * - * @param state - the `AuthenticationProgram` to evaluate + * @param state - the {@link AuthenticationProgram} to evaluate */ evaluate: (program: Readonly) => ProgramState; + /** + * Clone the provided ProgramState. + */ + stateClone: (state: Readonly) => ProgramState; + /** * Test the ProgramState to determine if execution should continue. */ @@ -173,7 +218,7 @@ export interface AuthenticationVirtualMachine< * Return an array of program states by fully evaluating `state`, cloning and * adding each intermediate state to the returned array. The first * `ProgramState` in the returned array is the initial program state, and the - * last `ProgramState` in the returned array is the first program state which + * last `ProgramState` in the returned array is the first program state that * returns `false` when provided to `stateContinue`. * * Note, this method is typically an implementation detail of the virtual @@ -186,7 +231,7 @@ export interface AuthenticationVirtualMachine< * Return a new program state by cloning and fully evaluating `state`. * * To evaluate a state, the state is cloned and provided to `stateStepMutate` - * until a final result is obtained (a `ProgramState` which returns `false` + * until a final result is obtained (a `ProgramState` that returns `false` * when provided to `stateContinue`). * * Note, this method is typically an implementation detail of the virtual @@ -205,7 +250,7 @@ export interface AuthenticationVirtualMachine< stateStep: (state: Readonly) => ProgramState; /** - * A faster, less-safe version of `step` which directly modifies the provided + * A faster, less-safe version of `step` that directly modifies the provided * program state. * * @param state - the program state to mutate @@ -213,7 +258,7 @@ export interface AuthenticationVirtualMachine< stateStepMutate: (state: ProgramState) => ProgramState; /** - * Verify a program state has completed evaluation successfully. + * Verify that a program state has completed evaluation successfully. * * @remarks * This method verifies a final `ProgramState` as emitted by the `evaluate` or @@ -222,30 +267,64 @@ export interface AuthenticationVirtualMachine< * `stateContinue` method. * @param state - the program state to verify */ - verify: (state: ProgramState) => true | string; + stateSuccess: (state: ProgramState) => string | true; + + /** + * Statelessly verify a fully-resolved transaction (e.g. the decoded + * transaction and an array of source outputs that are spent by its inputs). + * + * Returns `true` if the transaction is valid or an error message on failure. + * + * @remarks + * While the virtual machine can perform all stateless components of + * transaction validation, many applications also require stateful validation + * – e.g. checking for conflicting transactions (double-spends) – before + * accepting a transaction. + * + * For example, before a statelessly verified BCH transaction can be added to + * a block, node implementations must confirm that: + * - All `spentOutputs` are still unspent. + * - The transaction's claimed relative and absolute locktime values meet + * consensus requirements. (For determinism, time and confirmation-related VM + * operations are performed using the precise `locktime` and `sequenceNumber` + * values encoded in the transaction rather than "current" values on the + * network at validation time. While these values may allow the VM to verify + * the transaction, implementations must still ensure that the values are + * consistent with reality before accepting the transaction. See BIP65, BIP68, + * and BIP112 for details.) + */ + verify: (resolvedTransaction: ResolvedTransaction) => string | true; } /** - * Create an AuthenticationVirtualMachine to evaluate authentication programs - * constructed from operations in the `instructionSet`. - * @param instructionSet - an `InstructionSet` + * Create an {@link AuthenticationVirtualMachine} to evaluate authentication + * programs constructed from operations in the `instructionSet`. + * @param instructionSet - an {@link InstructionSet} */ export const createAuthenticationVirtualMachine = < - AuthenticationProgram, - ProgramState extends AuthenticationProgramStateMinimum = AuthenticationProgramStateBCH + ResolvedTransaction = ResolvedTransactionCommon, + AuthenticationProgram = AuthenticationProgramCommon, + ProgramState extends AuthenticationProgramStateMinimum = AuthenticationProgramStateCommon >( - instructionSet: InstructionSet -): AuthenticationVirtualMachine => { + instructionSet: InstructionSet< + ResolvedTransaction, + AuthenticationProgram, + ProgramState + > +): AuthenticationVirtualMachine< + ResolvedTransaction, + AuthenticationProgram, + ProgramState +> => { const availableOpcodes = 256; const operators = range(availableOpcodes).map((codepoint) => - (instructionSet.operations[codepoint] as - | Operation - | undefined) === undefined + instructionSet.operations[codepoint] === undefined ? instructionSet.undefined : instructionSet.operations[codepoint] ); - const getCodepoint = (state: ProgramState) => state.instructions[state.ip]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const getCodepoint = (state: ProgramState) => state.instructions[state.ip]!; const after = (state: ProgramState) => { // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data @@ -254,10 +333,16 @@ export const createAuthenticationVirtualMachine = < }; const getOperation = (state: ProgramState) => - operators[getCodepoint(state).opcode]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + operators[getCodepoint(state).opcode]!; - const stateStepMutate = (state: ProgramState) => - after(getOperation(state)(state)); + const noOp = ((state) => state) as Operation; + const stateEvery = instructionSet.every ?? noOp; + + const stateStepMutate = (state: ProgramState) => { + const operator = getOperation(state); + return after(stateEvery(operator(state))); + }; const stateContinue = instructionSet.continue; @@ -277,15 +362,15 @@ export const createAuthenticationVirtualMachine = < return state; }; - const clone = (state: ProgramState) => instructionSet.clone(state); - const { verify } = instructionSet; + const stateClone = (state: ProgramState) => instructionSet.clone(state); + const { success } = instructionSet; const stateEvaluate = (state: ProgramState) => - untilComplete(clone(state), stateStepMutate); + untilComplete(stateClone(state), stateStepMutate); const stateDebugStep = (state: ProgramState) => { const operator = getOperation(state); - return after(operator(clone(state))); + return after(stateEvery(operator(stateClone(state)))); }; const stateDebug = (state: ProgramState) => { @@ -302,7 +387,7 @@ export const createAuthenticationVirtualMachine = < return trace; }; - const stateStep = (state: ProgramState) => stateStepMutate(clone(state)); + const stateStep = (state: ProgramState) => stateStepMutate(stateClone(state)); const evaluate = (program: AuthenticationProgram) => instructionSet.evaluate(program, stateEvaluate); @@ -313,23 +398,25 @@ export const createAuthenticationVirtualMachine = < const debugResult = stateDebug(state); // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data results.push(...debugResult); - return ( - (debugResult[debugResult.length - 1] as ProgramState | undefined) ?? - state - ); + return debugResult[debugResult.length - 1] ?? state; }; const finalResult = instructionSet.evaluate(program, proxyDebug); return [...results, finalResult]; }; + const verify = (resolvedTransaction: ResolvedTransaction) => + instructionSet.verify(resolvedTransaction, evaluate, success); + return { debug, evaluate, + stateClone, stateContinue, stateDebug, stateEvaluate, stateStep, stateStepMutate, + stateSuccess: success, verify, }; }; diff --git a/src/lib/vm/vm-types.ts b/src/lib/vm/vm-types.ts index 097a1d30..ff66d4c1 100644 --- a/src/lib/vm/vm-types.ts +++ b/src/lib/vm/vm-types.ts @@ -1,20 +1,16 @@ -import { - Input, +import type { + AuthenticationInstruction, Output, - Transaction, - TransactionContextCommon, -} from '../transaction/transaction-types'; + TransactionCommon, +} from '../lib'; -import { AuthenticationErrorCommon } from './instruction-sets/common/errors'; -import { AuthenticationInstruction } from './instruction-sets/instruction-sets-types'; - -export interface AuthenticationProgramStateMinimum { +export interface AuthenticationProgramStateMinimum { /** * The full list of instructions to be evaluated by the virtual machine. */ - readonly instructions: readonly AuthenticationInstruction[]; + readonly instructions: readonly AuthenticationInstruction[]; /** - * Instruction Pointer – the array index of `instructions` which will be read + * Instruction Pointer – the array index of `instructions` that will be read * to identify the next instruction. Once `ip` exceeds the last index of * `instructions` (`ip === instructions.length`), evaluation is complete. */ @@ -40,54 +36,45 @@ export interface AuthenticationProgramStateAlternateStack< alternateStack: StackType[]; } -export interface AuthenticationProgramStateExecutionStack { +export interface AuthenticationProgramStateControlStack { /** * An array of boolean values representing the current execution status of the * program. This allows the state to track nested conditional branches. * * The `OP_IF` and `OP_NOTIF` operations push a new boolean onto the - * `executionStack`, `OP_ELSE` flips the top boolean, and `OP_ENDIF` removes - * the top boolean from the `executionStack`. + * `controlStack`, `OP_ELSE` flips the top boolean, and `OP_ENDIF` removes + * the top boolean from the `controlStack`. * - * Other instructions are only evaluated if `executionStack` contains no + * Other instructions are only evaluated if `controlStack` contains no * `false` items. * * A.K.A. `vfExec` in the C++ implementation. */ - executionStack: boolean[]; + controlStack: boolean[]; } -export interface AuthenticationProgramStateError< - InstructionSetError, - CommonError = AuthenticationErrorCommon -> { +export interface AuthenticationProgramStateError { /** * If present, the error returned by the most recent virtual machine * operation. */ - error?: CommonError | InstructionSetError; + error?: string; } -type MakeOptional = Partial> & Omit; - /** - * A reduced version of `AuthenticationProgramCommon` including only the - * information required to generate a `TransactionContextCommon`. + * A complete view of the information necessary to validate a transaction. */ -export interface AuthenticationProgramTransactionContextCommon { - inputIndex: number; - sourceOutput: Pick; - spendingTransaction: Transaction>; +export interface ResolvedTransactionCommon { + sourceOutputs: Output[]; + transaction: TransactionCommon; } /** - * A complete view of the information necessary to validate a specified input on - * the provided transaction. + * A complete view of the information necessary to validate a specified input in + * a transaction. */ -export interface AuthenticationProgramCommon { +export interface AuthenticationProgramCommon extends ResolvedTransactionCommon { inputIndex: number; - sourceOutput: Output; - spendingTransaction: Transaction; } export interface AuthenticationProgramStateSignatureAnalysis { @@ -96,30 +83,27 @@ export interface AuthenticationProgramStateSignatureAnalysis { * course of this program. Each raw signing serialization and data signature * message should be pushed to this array in the order it was computed. * - * This property is not used within any `AuthenticationVirtualMachine`, but it - * is provided in the program state to assist with analysis. Because these - * messages must always be computed and hashed during evaluation, recording - * them in the state does not meaningfully affect performance. + * This property is not used within any {@link AuthenticationVirtualMachine}, + * but it is provided in the program state to assist with analysis. Because + * these messages must always be computed and hashed during evaluation, + * recording them in the state does not meaningfully affect performance. */ signedMessages: Uint8Array[]; } export interface AuthenticationProgramStateInternalCommon< - Opcodes, - InstructionSetError, StackType = Uint8Array -> - extends AuthenticationProgramStateMinimum, +> extends AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateExecutionStack, - AuthenticationProgramStateError, + AuthenticationProgramStateControlStack, + AuthenticationProgramStateError, AuthenticationProgramStateSignatureAnalysis { /** * The `lastCodeSeparator` indicates the index of the most recently executed * `OP_CODESEPARATOR` instruction. In each of the signing serialization * algorithms, the `instructions` are sliced at `lastCodeSeparator`, and the - * subarray is re-serialized. The resulting bytecode is called the + * subarray is re-encoded. The resulting bytecode is called the * `coveredBytecode` (A.K.A. `scriptCode`), and is part of the data hashed to * create the signing serialization digest. * @@ -131,6 +115,7 @@ export interface AuthenticationProgramStateInternalCommon< signatureOperationsCount: number; } -export interface AuthenticationProgramStateCommon - extends AuthenticationProgramStateInternalCommon, - TransactionContextCommon {} +export interface AuthenticationProgramStateCommon + extends AuthenticationProgramStateInternalCommon { + program: Readonly; +} diff --git a/src/lib/vm/vm.ts b/src/lib/vm/vm.ts index 6a4cb7fe..21d006d3 100644 --- a/src/lib/vm/vm.ts +++ b/src/lib/vm/vm.ts @@ -1,3 +1,3 @@ -export * from './instruction-sets/instruction-sets'; -export * from './vm-types'; -export * from './virtual-machine'; +export * from './instruction-sets/instruction-sets.js'; +export * from './virtual-machine.js'; +export * from './vm-types.js'; diff --git a/src/lib/vmb-tests/bch-vmb-test-mixins.ts b/src/lib/vmb-tests/bch-vmb-test-mixins.ts new file mode 100644 index 00000000..cac177c8 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-test-mixins.ts @@ -0,0 +1,78 @@ +import type { + AuthenticationTemplateScenario, + AuthenticationTemplateScenarioInput, + AuthenticationTemplateScenarioSourceOutput, + AuthenticationTemplateScenarioTransactionOutput, +} from '../lib'; + +export const simpleP2pkhOutput: AuthenticationTemplateScenarioSourceOutput = { + lockingBytecode: { script: 'lockP2pkh' }, + valueSatoshis: 10_000, +}; +export const simpleP2pkhInput: AuthenticationTemplateScenarioInput = { + unlockingBytecode: { script: 'unlockP2pkh' }, +}; +export const vmbTestOutput: AuthenticationTemplateScenarioTransactionOutput = { + lockingBytecode: { script: 'vmbTestNullData' }, + valueSatoshis: 0, +}; + +export const slotOutput: AuthenticationTemplateScenarioSourceOutput = { + lockingBytecode: ['slot'], + valueSatoshis: 10_000, +}; + +export const slotInput: AuthenticationTemplateScenarioInput = { + unlockingBytecode: ['slot'], +}; + +export const slot0Scenario: AuthenticationTemplateScenario = { + sourceOutputs: [slotOutput, simpleP2pkhOutput], + transaction: { + inputs: [slotInput, simpleP2pkhInput], + outputs: [vmbTestOutput], + }, +}; +export const slot1Scenario: AuthenticationTemplateScenario = { + sourceOutputs: [simpleP2pkhOutput, slotOutput], + transaction: { + inputs: [simpleP2pkhInput, slotInput], + outputs: [vmbTestOutput], + }, +}; +export const slot2Scenario: AuthenticationTemplateScenario = { + sourceOutputs: [simpleP2pkhOutput, simpleP2pkhOutput, slotOutput], + transaction: { + inputs: [simpleP2pkhInput, simpleP2pkhInput, slotInput], + outputs: [vmbTestOutput], + }, +}; +export const slot9Scenario: AuthenticationTemplateScenario = { + sourceOutputs: [ + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + simpleP2pkhOutput, + slotOutput, + ], + transaction: { + inputs: [ + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + simpleP2pkhInput, + slotInput, + ], + outputs: [vmbTestOutput], + }, +}; diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts new file mode 100644 index 00000000..94dcc106 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts @@ -0,0 +1,101 @@ +import test from 'ava'; + +import { stringifyTestVector, vmbTestGroupToVmbTests } from '../lib.js'; + +/* spell-checker: disable */ +test('vmbTestGroupToVmbTests', (t) => { + const result = vmbTestGroupToVmbTests([ + 'Basic push operations', + [ + [ + 'OP_0', + 'OP_SIZE <0> OP_EQUAL', + 'OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item', + ], + [ + 'OP_PUSHBYTES_1', + 'OP_SIZE <1> OP_EQUAL', + 'OP_PUSHBYTES_1 with missing bytes', + ['invalid'], + ], + [ + '<0>', + 'OP_DROP OP_TXINPUTCOUNT <1> OP_EQUAL', + 'OP_TXINPUTCOUNT operation exists', + ['2021_invalid'], + ], + ], + ]); + t.deepEqual( + result, + [ + [ + [ + '606em', + 'Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (nonP2SH)', + 'OP_0', + 'OP_SIZE <0> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003820087', + ['2021_valid', '2022_valid'], + 1, + ], + [ + 'm5vzq', + 'Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (P2SH20)', + 'OP_0', + 'OP_SIZE <0> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050003820087000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146b14122b4b3cb280c9ec66f8e2827cf3384010a387', + ['2021_standard', '2022_standard'], + 1, + ], + ], + [ + [ + 'cjtdh', + 'Basic push operations: OP_PUSHBYTES_1 with missing bytes (nonP2SH)', + 'OP_PUSHBYTES_1', + 'OP_SIZE <1> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000101000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825187', + ['2021_invalid', '2022_invalid'], + 1, + ], + [ + 'urv4v', + 'Basic push operations: OP_PUSHBYTES_1 with missing bytes (P2SH20)', + 'OP_PUSHBYTES_1', + 'OP_SIZE <1> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050103825187000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914348babd902f9237b6d28ad1ee00bf6941bc9bddc87', + ['2021_invalid', '2022_invalid'], + 1, + ], + ], + [ + [ + '30lcr', + 'Basic push operations: OP_TXINPUTCOUNT operation exists (nonP2SH)', + '<0>', + 'OP_DROP OP_TXINPUTCOUNT <1> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000475c35187', + ['2021_invalid', '2022_valid'], + 1, + ], + [ + '3gtat', + 'Basic push operations: OP_TXINPUTCOUNT operation exists (P2SH20)', + '<0>', + 'OP_DROP OP_TXINPUTCOUNT <1> OP_EQUAL', + '02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000475c35187000000000100000000000000000a6a08766d625f7465737400000000', + '0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e57b1d9d4512a857ac3c1623bceacfd2356463d187', + ['2021_invalid', '2022_standard'], + 1, + ], + ], + ], + `Stringified test vector:\n${stringifyTestVector(result)}` + ); +}); diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.ts b/src/lib/vmb-tests/bch-vmb-test-utils.ts new file mode 100644 index 00000000..a22964f7 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-test-utils.ts @@ -0,0 +1,343 @@ +/** + * This script generates all bch_vmb_tests, run it with: `yarn gen:tests`. + */ +import { encodeBech32, regroupBits } from '../address/address.js'; +import { createCompilerBCH } from '../compiler/compiler-bch/compiler-bch.js'; +import { authenticationTemplateToCompilerConfiguration } from '../compiler/compiler-utils.js'; +import { sha256 } from '../crypto/default-crypto-instances.js'; +import { binToHex, flattenBinArray } from '../format/format.js'; +import type { + AuthenticationTemplate, + AuthenticationTemplateScenario, +} from '../lib'; +import { + encodeTransaction, + encodeTransactionOutputs, +} from '../message/message.js'; + +import { slot1Scenario } from './bch-vmb-test-mixins.js'; + +/** + * These are the VM versions for which tests are currently generated. + * + * A new 4-digit year should be added to prepare for each annual upgrade. + * Libauth can also support testing of draft proposals by specifying a short + * identifier for each independent proposal. + */ +const vmVersions = [ + '2021', + '2022', + 'chip_cashtokens', + 'chip_limits', + 'chip_loops', + 'chip_minimalbool', + 'chip_p2sh32', + 'chip_strict_checkmultisig', + 'chip_zce', +] as const; +/** + * These are the VM "modes" for which tests can be generated. + */ +const vmModes = ['nop2sh', 'p2sh20', 'p2sh32'] as const; + +type TestSetType = 'invalid' | 'standard' | 'valid'; +type TestSetOverrideType = TestSetType | 'ignore'; +type VmVersion = typeof vmVersions[number]; +type VmMode = typeof vmModes[number]; +type TestSetOverride = + | `${TestSetOverrideType}` + | `${VmMode}_${TestSetOverrideType}` + | `${VmVersion}_${TestSetOverrideType}` + | `${VmVersion}_${VmMode}_${TestSetOverrideType}`; + +export const vmbTestDefinitionDefaultBehavior: TestSetOverride[] = [ + 'nop2sh_valid', + 'p2sh20_standard', + 'p2sh32_ignore', +]; + +export type TestSet = `${VmVersion}_${TestSetType}`; + +export type VmbTestMaster = [ + shortId: string, + testDescription: string, + unlockingScriptAsm: string, + redeemOrLockingScriptAsm: string, + testTransactionHex: string, + sourceOutputsHex: string, + testSets: TestSet[], + /** + * This isn't required for testing (implementations should always validate the + * full test transaction), but it can allow downstream applications to + * identify which source output/transaction input index is the focus of each + * test. This is sometimes useful for debugging or for VM documentation + * projects that extract usage examples from vmb tests. + * + * This field is left undefined for `inputIndex`s of `0` (the default). + */ + inputIndex?: number +]; + +export type VmbTest = [ + shortId: string, + testDescription: string, + unlockingScriptAsm: string, + redeemOrLockingScriptAsm: string, + testTransactionHex: string, + sourceOutputsHex: string, + inputIndex?: number +]; + +/* eslint-disable @typescript-eslint/naming-convention */ +/** + * The list of test set overrides currently supported. Eventually this should be + * `TestSetOverride`. + * + * For now, this implementation simplifies VMB test generation – we just + * `join()` the provided overrides and look up resulting modes/test sets here. + */ +type SupportedTestSetOverrideLists = + | ['2021_invalid', '2022_valid', 'p2sh_ignore'] + | ['2021_invalid', '2022_valid'] + | ['2021_invalid', 'nonP2sh_invalid'] + | ['2021_invalid', 'nonP2sh20_invalid'] + | ['2021_invalid', 'p2sh_ignore'] + | ['2021_invalid', 'p2sh_invalid'] + | ['2021_invalid'] + | ['invalid', '2022_nonP2sh_valid'] + | ['invalid', '2022_p2sh_standard'] + | ['invalid', 'nonP2sh_valid'] + | ['invalid', 'p2sh_ignore'] + | ['invalid'] + | ['valid'] + | []; +export const supportedTestSetOverrides: { + [joinedList: string]: { + mode: 'nonP2SH' | 'P2SH20' | 'P2SH32'; + sets: TestSet[]; + }[]; +} = { + '': [ + { mode: 'nonP2SH', sets: ['2021_valid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_standard', '2022_standard'] }, + ], + '2021_invalid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_standard'] }, + ], + '2021_invalid,2022_valid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_valid'] }, + ], + '2021_invalid,2022_valid,p2sh_ignore': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + ], + '2021_invalid,nonP2sh20_invalid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_invalid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_standard'] }, + ], + '2021_invalid,nonP2sh_invalid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_invalid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_standard'] }, + ], + '2021_invalid,p2sh_ignore': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + ], + '2021_invalid,p2sh_invalid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_invalid'] }, + ], + invalid: [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_invalid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_invalid'] }, + ], + 'invalid,2022_nonP2sh_valid': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_invalid'] }, + ], + 'invalid,2022_p2sh_standard': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_invalid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_standard'] }, + ], + 'invalid,nonP2sh_valid': [ + { mode: 'nonP2SH', sets: ['2021_valid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_invalid', '2022_invalid'] }, + ], + 'invalid,p2sh_ignore': [ + { mode: 'nonP2SH', sets: ['2021_invalid', '2022_invalid'] }, + ], + valid: [ + { mode: 'nonP2SH', sets: ['2021_valid', '2022_valid'] }, + { mode: 'P2SH20', sets: ['2021_valid', '2022_valid'] }, + ], +}; +/* eslint-enable @typescript-eslint/naming-convention */ + +export type VmbTestDefinition = [ + /** + * This script (defined using CashAssembly) is compiled to `unlockingBytecode` + * in the test transaction(s) produced by this test definition. + */ + unlockingScript: string, + /** + * This script (defined using CashAssembly) is compiled to the + * `redeemBytecode` and/or `lockingBytecode` to be satisfied by + * `unlockingScript`. + * + * By default, each test definitions generates two tests, one test uses this + * value as a simple `lockingBytecode`, the other test encodes this value as + * the `redeemBytecode` of a P2SH20 UTXO (properly appending it to + * `unlockingBytecode` in the test transaction). + * + * For `standard` test definitions, the P2SH evaluation is tested in standard + * mode and the non-P2SH evaluation is tested in non-standard mode (marked as + * only a `valid` test). For `valid` test definitions, both tests are marked + * as `valid`. + */ + redeemOrLockingScript: string, + testDescription: string, + testSetOverrideLabels?: SupportedTestSetOverrideLists, + /** + * A scenario that extends the default scenario for use with this test. + */ + scenario?: AuthenticationTemplateScenario, + /** + * An additional mapping of scripts to make available during scenario + * generation. + */ + additionalScripts?: AuthenticationTemplate['scripts'] +]; +export type VmbTestDefinitionGroup = [ + groupDescription: string, + tests: VmbTestDefinition[] +]; + +/** + * Short IDs use bech32 encoding, so birthday collisions will happen + * approximately every `Math.sqrt(2 * (32 ** defaultShortIdLength))` tests. + */ +const defaultShortIdLength = 5; + +/** + * Given a VMB test definition, generate a full VMB test vector. Note, this + * method throws immediately on the first test vector generation failure. + */ +export const vmbTestDefinitionToVmbTests = ( + testDefinition: VmbTestDefinition, + groupName = '', + shortIdLength = defaultShortIdLength +): VmbTestMaster[] => { + const [ + unlockingScript, + redeemOrLockingScript, + testDescription, + testSetOverrideLabels, + scenarioOverride, + additionalScripts, + ] = testDefinition; + const scenarioId = 'test'; + + const testGenerationPlan = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + supportedTestSetOverrides[(testSetOverrideLabels ?? []).join(',')]!; + + const scenarioDefinition = { extends: 'vmb_default', ...scenarioOverride }; + + const configuration = authenticationTemplateToCompilerConfiguration({ + entities: { tester: { variables: { key1: { type: 'HdKey' } } } }, + scenarios: { + [scenarioId]: scenarioDefinition, + // eslint-disable-next-line @typescript-eslint/naming-convention, camelcase + vmb_default: slot1Scenario, + }, + scripts: { + ...additionalScripts, + lockEmptyP2sh20: { lockingType: 'p2sh20', script: '' }, + lockP2pkh: { + lockingType: 'standard', + script: + 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + }, + lockP2sh20: { lockingType: 'p2sh20', script: redeemOrLockingScript }, + lockStandard: { lockingType: 'standard', script: redeemOrLockingScript }, + unlockEmptyP2sh20: { script: '<1>', unlocks: 'lockEmptyP2sh20' }, + unlockP2pkh: { + /** + * Uses `corresponding_output_single_input` to reuse the same signature + * as much as possible (making VMB test files more compressible). + */ + script: + ' ', + unlocks: 'lockP2pkh', + }, + unlockP2sh20: { script: unlockingScript, unlocks: 'lockP2sh20' }, + unlockStandard: { script: unlockingScript, unlocks: 'lockStandard' }, + vmbTestNullData: { + lockingType: 'standard', + script: 'OP_RETURN <"vmb_test">', + }, + }, + supported: ['BCH_2022_05'], + version: 0, + }); + const compiler = createCompilerBCH(configuration); + + const tests = testGenerationPlan.map((planItem) => { + const description = `${groupName}: ${testDescription} (${planItem.mode})`; + const result = compiler.generateScenario({ + debug: true, + scenarioId, + unlockingScriptId: { + // eslint-disable-next-line @typescript-eslint/naming-convention + P2SH20: 'unlockP2sh20', + // eslint-disable-next-line @typescript-eslint/naming-convention + P2SH32: 'unlockP2sh32', + nonP2SH: 'unlockStandard', + }[planItem.mode], + }); + if (typeof result === 'string') { + // eslint-disable-next-line functional/no-throw-statement + throw new Error(`Error while generating "${description}" - ${result}`); + } + if (typeof result.scenario === 'string') { + // eslint-disable-next-line functional/no-throw-statement + throw new Error( + `Error while generating "${description}" - ${result.scenario}` + ); + } + const encodedTx = encodeTransaction(result.scenario.program.transaction); + const encodedSourceOutputs = encodeTransactionOutputs( + result.scenario.program.sourceOutputs + ); + const shortId = encodeBech32( + regroupBits({ + bin: sha256.hash(flattenBinArray([encodedTx, encodedSourceOutputs])), + resultWordLength: 5, + sourceWordLength: 8, + }) as number[] + ).slice(0, shortIdLength); + + const testCase = [ + shortId, + description, + unlockingScript, + redeemOrLockingScript, + binToHex(encodedTx), + binToHex(encodedSourceOutputs), + planItem.sets, + ]; + + return ( + result.scenario.program.inputIndex === 0 + ? testCase + : [...testCase, result.scenario.program.inputIndex] + ) as VmbTestMaster; + }); + + return tests; +}; + +export const vmbTestGroupToVmbTests = (testGroup: VmbTestDefinitionGroup) => + testGroup[1].map((testDefinition) => + vmbTestDefinitionToVmbTests(testDefinition, testGroup[0]) + ); diff --git a/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts new file mode 100644 index 00000000..a1b02993 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts @@ -0,0 +1,169 @@ +/* eslint-disable no-console, functional/no-expression-statement, @typescript-eslint/no-non-null-assertion */ +import { + createVirtualMachineBCH2021, + createVirtualMachineBCH2022, + decodeTransactionOutputsUnsafe, + decodeTransactionUnsafeBCH, + hexToBin, + isPayToScriptHash20, + stringify, + stringifyDebugTraceSummary, + summarizeDebugTrace, +} from '../lib.js'; + +// eslint-disable-next-line import/no-internal-modules +import vmbTestsBCHJson from './generated/bch/bch_vmb_tests.json' assert { type: 'json' }; + +const vms = { + /* eslint-disable @typescript-eslint/naming-convention, camelcase */ + bch_2021_standard: createVirtualMachineBCH2021(true), + bch_2021_valid: createVirtualMachineBCH2021(false), + bch_2022_standard: createVirtualMachineBCH2022(true), + bch_2022_valid: createVirtualMachineBCH2022(false), + /* eslint-enable @typescript-eslint/naming-convention, camelcase */ +}; +const isVm = (vmId: string): vmId is keyof typeof vms => + Object.keys(vms).includes(vmId); + +const usageInfo = ` +This script runs a single VMB test on the requested VM, logging the results and debugging information. Use the "-v" flag to output the full debug trace. + +Available VMs: ${Object.keys(vms).join(', ')} + +Usage: yarn test:unit:vmb_test [-v] +E.g.: yarn test:unit:vmb_test bch_2022_standard 9046t +`; + +const [, , vmId, testId, useVerbose] = process.argv; +if (vmId === undefined || testId === undefined) { + console.log(usageInfo); + process.exit(1); +} + +if (!isVm(vmId)) { + console.log(`Error: the VM "${vmId}" is unknown.\n${usageInfo}`); + process.exit(1); +} + +const vm = vms[vmId]; + +const testDefinition = ( + vmbTestsBCHJson as [ + shortId: string, + testDescription: string, + unlockingScriptAsm: string, + redeemOrLockingScriptAsm: string, + testTransactionHex: string, + sourceOutputsHex: string, + testSets: string[], + inputIndex?: number + ][] +).find(([shortId]) => shortId === testId); + +if (testDefinition === undefined) { + console.log(`Error: the test ID "${testId}" is unknown.\n${usageInfo}`); + process.exit(1); +} + +const [ + shortId, + testDescription, + unlockingScriptAsm, + redeemOrLockingScriptAsm, + txHex, + sourceOutputsHex, + testSets, + inputIndex, +] = testDefinition; + +const testedIndex = inputIndex ?? 0; +const transaction = decodeTransactionUnsafeBCH(hexToBin(txHex)); +const { outputs: sourceOutputs } = decodeTransactionOutputsUnsafe( + hexToBin(sourceOutputsHex), + 0 +); +const result = vm.verify({ sourceOutputs, transaction }); + +const program = { + inputIndex: testedIndex, + sourceOutputs, + transaction, +}; + +const debugResult = vm.debug(program); +const failingIndex = + typeof result === 'string' + ? /evaluating input index (?\d+)/u.exec(result)?.groups?.['index'] + : undefined; +const unexpectedFailingIndexDebugTrace = + failingIndex !== undefined && Number(failingIndex) !== testedIndex + ? vm.debug({ + inputIndex: Number(failingIndex), + sourceOutputs, + transaction, + }) + : undefined; + +const isP2sh20 = isPayToScriptHash20( + sourceOutputs[testedIndex]!.lockingBytecode +); + +const verbose = ` +Verbose information (-v): +========================= + +${ + unexpectedFailingIndexDebugTrace === undefined + ? '' + : ` +Full debug trace at failing index ${failingIndex!}: +${stringify(unexpectedFailingIndexDebugTrace)} + +---------- +` +} + +Full debug trace at index ${testedIndex}: +${stringify(debugResult)} + +---------- + +Source outputs (hex): ${sourceOutputsHex} +Decoded: +${stringify(sourceOutputs)} + +---------- + +Transaction (hex): ${txHex} +Decoded: +${stringify(transaction)} + +Standard information: +===================== +`; + +console.log(` +${useVerbose === undefined ? '' : verbose} + +VMB test ID: ${shortId} +Description: ${testDescription} +Test sets: ${testSets.join(', ')} + +Unlocking ASM: ${unlockingScriptAsm} +${isP2sh20 ? 'Redeem (P2SH20)' : 'Locking'} ASM: ${redeemOrLockingScriptAsm} +Result: ${result === true ? 'Success' : `Failed: ${result}`}${ + unexpectedFailingIndexDebugTrace === undefined + ? '' + : ` +Note: an unexpected index is failing; the input index under test is ${testedIndex}, but input index ${failingIndex!} failed. + +Evaluation at failing index (${failingIndex!}): +${stringifyDebugTraceSummary( + summarizeDebugTrace(unexpectedFailingIndexDebugTrace) +)} +` +} +Evaluation at index ${testedIndex}: + +${stringifyDebugTraceSummary(summarizeDebugTrace(debugResult))} +`); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts new file mode 100644 index 00000000..07d59c27 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts @@ -0,0 +1,76 @@ +/* eslint-disable functional/no-expression-statement */ + +/** + * This script generates all bch_vmb_tests, run it with: `yarn gen:vmb-tests`. + */ +import { writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +import type { TestSet, VmbTest } from '../lib'; + +import { vmbTestsBCH } from './bch-vmb-tests.js'; + +/** + * Script accepts one argument: an `outputDir` to which all generated files will + * be saved. + */ +const [, , outputDir] = process.argv; +if (outputDir === undefined) { + // eslint-disable-next-line functional/no-throw-statement + throw new Error('Script requires an output directory.'); +} +const outputAbsolutePath = resolve(outputDir); + +const testGroupsAndTypes = 2; +const allTestCases = vmbTestsBCH.flat(testGroupsAndTypes); + +writeFileSync( + `${outputAbsolutePath}/bch_vmb_tests.json`, + JSON.stringify(allTestCases), + { encoding: 'utf8' } +); + +// iterate over allTestCases, split into files by testSets (case[6]) + +const partitionedTestCases = allTestCases.reduce<{ + [key in TestSet]?: VmbTest[]; +}>((accumulatedTestSets, testCase) => { + const [ + shortId, + testDescription, + unlockingScriptAsm, + redeemOrLockingScriptAsm, + testTransactionHex, + sourceOutputsHex, + testSets, + inputIndex, + ] = testCase; + + const withoutSets = [ + shortId, + testDescription, + unlockingScriptAsm, + redeemOrLockingScriptAsm, + testTransactionHex, + sourceOutputsHex, + ...(inputIndex === undefined ? [] : [inputIndex]), + ] as VmbTest; + + // eslint-disable-next-line functional/no-return-void + testSets.forEach((testSet) => { + // eslint-disable-next-line functional/immutable-data + accumulatedTestSets[testSet] = [ + ...(accumulatedTestSets[testSet] ?? []), + withoutSets, + ]; + }); + return accumulatedTestSets; +}, {}); + +// eslint-disable-next-line functional/no-return-void +Object.entries(partitionedTestCases).forEach(([testSetName, testSet]) => { + const filepath = testSetName.startsWith('CHIP') + ? `${outputAbsolutePath}/CHIPs/bch_vmb_tests_${testSetName}.json` + : `${outputAbsolutePath}/bch_vmb_tests_${testSetName}.json`; + writeFileSync(filepath, JSON.stringify(testSet), { encoding: 'utf8' }); +}); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.ts new file mode 100644 index 00000000..a1377de3 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.ts @@ -0,0 +1,212 @@ +import test from 'ava'; + +import type { AuthenticationVirtualMachineBCH, VmbTest } from '../lib'; +import { + createVirtualMachineBCH2021, + createVirtualMachineBCH2022, + decodeTransactionOutputsUnsafe, + decodeTransactionUnsafeBCH, + hexToBin, + stringify, + stringifyDebugTraceSummary, + summarizeDebugTrace, +} from '../lib.js'; + +import { vmbTestsBCH } from './bch-vmb-tests.js'; +/* eslint-disable import/no-restricted-paths, import/no-internal-modules */ +import vmbTestsBCHJson from './generated/bch/bch_vmb_tests.json' assert { type: 'json' }; +import vmbTestsBCH2021InvalidJson from './generated/bch/bch_vmb_tests_2021_invalid.json' assert { type: 'json' }; +import vmbTestsBCH2021StandardJson from './generated/bch/bch_vmb_tests_2021_standard.json' assert { type: 'json' }; +import vmbTestsBCH2021ValidJson from './generated/bch/bch_vmb_tests_2021_valid.json' assert { type: 'json' }; +import vmbTestsBCH2022InvalidJson from './generated/bch/bch_vmb_tests_2022_invalid.json' assert { type: 'json' }; +import vmbTestsBCH2022StandardJson from './generated/bch/bch_vmb_tests_2022_standard.json' assert { type: 'json' }; +import vmbTestsBCH2022ValidJson from './generated/bch/bch_vmb_tests_2022_valid.json' assert { type: 'json' }; +/* eslint-enable import/no-restricted-paths, import/no-internal-modules */ + +test('bch_vmb_tests.json is up to date and contains no test ID collisions', (t) => { + const testGroupsAndTypes = 2; + const allTestCases = vmbTestsBCH.flat(testGroupsAndTypes); + t.deepEqual( + allTestCases, + vmbTestsBCHJson, + 'New test definitions were added to `bch-vmb.tests.ts`, but the generated tests were not updated. Run "yarn gen:vmb-tests" to correct this issue. (Note: tsc watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc to clear this error after re-generating tests.)' + ); + + const testCaseIds = allTestCases.map((testCase) => testCase[0]); + const firstDuplicate = testCaseIds.find( + (id, index) => testCaseIds.lastIndexOf(id) !== index + ); + const noDuplicates = '✅ No duplicate short IDs'; + const duplicateStatus = + firstDuplicate === undefined + ? noDuplicates + : `Duplicate short ID found: ${firstDuplicate}`; + t.is( + duplicateStatus, + noDuplicates, + `Multiple VMB test vectors share a short ID. Either increase the short ID length, or tweak one of the test definitions to eliminate the collision.` + ); +}); + +const testVm = ({ + fails, + succeeds, + vm, + vmName, +}: { + vmName: string; + succeeds: VmbTest[][]; + fails: VmbTest[][]; + vm: AuthenticationVirtualMachineBCH; +}) => { + const runCase = test.macro({ + // eslint-disable-next-line complexity + exec: (t, testCase: VmbTest, expectedToSucceed: boolean) => { + const [ + shortId, + description, + unlockingAsm, + lockingAsm, + txHex, + sourceOutputsHex, + inputIndex, + ] = testCase; + const testedIndex = inputIndex ?? 0; + const transaction = decodeTransactionUnsafeBCH(hexToBin(txHex)); + const { outputs: sourceOutputs } = decodeTransactionOutputsUnsafe( + hexToBin(sourceOutputsHex) + ); + const result = vm.verify({ sourceOutputs, transaction }); + const moreDetails = `For more detailed debugging information, run: "yarn test:unit:vmb_test ${vmName} ${shortId} -v"`; + const logDebugInfo = () => { + t.log(`unlockingAsm: ${unlockingAsm}`); + t.log(`lockingAsm: ${lockingAsm}`); + const program = { + inputIndex: testedIndex, + sourceOutputs, + transaction, + }; + const evaluateResult = vm.evaluate(program); + const debugResult = vm.debug(program); + t.deepEqual( + evaluateResult, + debugResult[debugResult.length - 1], + `vm.evaluate and the final result of vm.debug differ: is something being unexpectedly mutated? evaluateResult:\n\n${stringify( + evaluateResult + )}\n\nFinal debugResult:\n\n${stringify( + debugResult[debugResult.length - 1] + )}` + ); + t.log(stringifyDebugTraceSummary(summarizeDebugTrace(debugResult))); + t.log(moreDetails); + }; + if (expectedToSucceed && typeof result === 'string') { + const inputIssueRegExp = /evaluating input index (?\d+)/u; + const failingIndex = inputIssueRegExp.exec(result)?.groups?.['index']; + if ( + failingIndex !== undefined && + Number(failingIndex) !== testedIndex + ) { + t.fail( + `An unexpected input index caused VMB test "${shortId}" to fail for ${vmName}: the input index under test is ${testedIndex}, but input index ${failingIndex} failed. Error: ${result}` + ); + t.log( + `Failing input at index ${failingIndex}:`, + stringifyDebugTraceSummary( + summarizeDebugTrace( + vm.debug({ + inputIndex: Number(failingIndex), + sourceOutputs, + transaction, + }) + ) + ) + ); + t.log(moreDetails); + return; + } + logDebugInfo(); + t.fail( + `VMB test "${shortId}" – "${description}" – for ${vmName} is expected to succeed but failed. Error: ${result}` + ); + return; + } + if (!expectedToSucceed && typeof result !== 'string') { + logDebugInfo(); + t.fail( + `VMB test "${shortId}" – "${description}" – for ${vmName} is expected to fail but succeeded.` + ); + return; + } + t.pass(); + }, + title: ( + // eslint-disable-next-line @typescript-eslint/default-param-last + caseNumberOfCaseCount = '(unknown/unknown)', + [shortId, description] + ) => + `[vmb_tests] [${vmName}] ${shortId} ${caseNumberOfCaseCount}: ${description}`, + }); + const expectedPass = succeeds.flat(1); + const expectedFail = fails.flat(1); + expectedPass.forEach((testCase, index) => { + test( + `(${index + 1}/${expectedPass.length + expectedFail.length} S)`, + runCase, + testCase, + true + ); + }); + expectedFail.forEach((testCase, index) => { + test( + `(${expectedPass.length + index + 1}/${ + expectedPass.length + expectedFail.length + } F)`, + runCase, + testCase, + false + ); + }); +}; + +testVm({ + fails: [ + vmbTestsBCH2021InvalidJson as VmbTest[], + vmbTestsBCH2021ValidJson as VmbTest[], + ], + succeeds: [vmbTestsBCH2021StandardJson as VmbTest[]], + vm: createVirtualMachineBCH2021(true), + vmName: 'bch_2021_standard', +}); + +testVm({ + fails: [vmbTestsBCH2021InvalidJson as VmbTest[]], + succeeds: [ + vmbTestsBCH2021StandardJson as VmbTest[], + vmbTestsBCH2021ValidJson as VmbTest[], + ], + vm: createVirtualMachineBCH2021(false), + vmName: 'bch_2021_valid', +}); + +testVm({ + fails: [ + vmbTestsBCH2022InvalidJson as VmbTest[], + vmbTestsBCH2022ValidJson as VmbTest[], + ], + succeeds: [vmbTestsBCH2022StandardJson as VmbTest[]], + vm: createVirtualMachineBCH2022(true), + vmName: 'bch_2022_standard', +}); + +testVm({ + fails: [vmbTestsBCH2022InvalidJson as VmbTest[]], + succeeds: [ + vmbTestsBCH2022StandardJson as VmbTest[], + vmbTestsBCH2022ValidJson as VmbTest[], + ], + vm: createVirtualMachineBCH2022(false), + vmName: 'bch_2022_valid', +}); + +test.todo('test CHIP limits VM'); diff --git a/src/lib/vmb-tests/bch-vmb-tests.ts b/src/lib/vmb-tests/bch-vmb-tests.ts new file mode 100644 index 00000000..d72183c3 --- /dev/null +++ b/src/lib/vmb-tests/bch-vmb-tests.ts @@ -0,0 +1,758 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ +/** + * See the [Libauth VMB Tests Readme](./readme.md) for background information on + * VMB tests. + * + * Below is the source data structure used to generate the Libauth Bitcoin Cash + * (BCH) Virtual Machine Bytecode (VMB) tests (`bch_vmb_tests.json` and all + * `bch_vmb_tests_*.json` files). Compiling from this file allows us to easily + * 1) validate the data structure, and 2) reproducibly generate artifacts like + * public keys, hashes, and signatures. + * + * To add tests to this file: + * 1. Clone the Libauth repo and install dependencies using `yarn install`. + * 2. Add the new tests below. + * 3. Run `yarn gen:tests` to regenerate all test vectors. + * 5. Run `yarn test` to ensure everything is working, then send your PR. + * + * Note: for performance reasons, this file is not exported by the library, but + * it can still be directly imported. + */ + +import type { VmbTestDefinitionGroup } from '../lib'; +import { bigIntToBinUint64LE, binToHex, cashAssemblyToBin, range } from '../lib.js'; + +import { slot0Scenario, slot2Scenario, slot9Scenario } from './bch-vmb-test-mixins.js'; +import { vmbTestGroupToVmbTests } from './bch-vmb-test-utils.js'; + +/** + * The source data structure used to generate the Libauth BCH VMB test + * vectors (`bch_vmb_tests.json` and all `bch_vmb_*_tx.json` files). + */ +export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ + [ + 'Basic push operations', + [ + ['OP_0', 'OP_SIZE <0> OP_EQUAL OP_NIP', 'OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item'], + ['OP_PUSHBYTES_1 0x00', 'OP_SIZE <1> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_1'], + ['OP_PUSHBYTES_2 0x0000', 'OP_SIZE <2> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_2'], + ['OP_PUSHBYTES_3 0x000000', 'OP_SIZE <3> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_3'], + ['OP_PUSHBYTES_4 0x00000000', 'OP_SIZE <4> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_4'], + ['OP_PUSHBYTES_5 0x0000000000', 'OP_SIZE <5> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_5'], + ['OP_PUSHBYTES_6 0x000000000000', 'OP_SIZE <6> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_6'], + ['OP_PUSHBYTES_7 0x00000000000000', 'OP_SIZE <7> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_7'], + ['OP_PUSHBYTES_8 0x0000000000000000', 'OP_SIZE <8> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_8'], + ['OP_PUSHBYTES_9 0x000000000000000000', 'OP_SIZE <9> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_9'], + ['OP_PUSHBYTES_10 0x00000000000000000000', 'OP_SIZE <10> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_10'], + ['OP_PUSHBYTES_11 0x0000000000000000000000', 'OP_SIZE <11> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_11'], + ['OP_PUSHBYTES_12 0x000000000000000000000000', 'OP_SIZE <12> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_12'], + ['OP_PUSHBYTES_13 0x00000000000000000000000000', 'OP_SIZE <13> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_13'], + ['OP_PUSHBYTES_14 0x0000000000000000000000000000', 'OP_SIZE <14> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_14'], + ['OP_PUSHBYTES_15 0x000000000000000000000000000000', 'OP_SIZE <15> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_15'], + ['OP_PUSHBYTES_16 0x00000000000000000000000000000000', 'OP_SIZE <16> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_16'], + ['OP_PUSHBYTES_17 0x0000000000000000000000000000000000', 'OP_SIZE <17> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_17'], + ['OP_PUSHBYTES_18 0x000000000000000000000000000000000000', 'OP_SIZE <18> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_18'], + ['OP_PUSHBYTES_19 0x00000000000000000000000000000000000000', 'OP_SIZE <19> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_19'], + ['OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000', 'OP_SIZE <20> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_20'], + ['OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000', 'OP_SIZE <21> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_21'], + ['OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000', 'OP_SIZE <22> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_22'], + ['OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000', 'OP_SIZE <23> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_23'], + ['OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000', 'OP_SIZE <24> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_24'], + ['OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000', 'OP_SIZE <25> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_25'], + ['OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000', 'OP_SIZE <26> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_26'], + ['OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000', 'OP_SIZE <27> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_27'], + ['OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000', 'OP_SIZE <28> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_28'], + ['OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <29> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_29'], + ['OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <30> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_30'], + ['OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <31> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_31'], + ['OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <32> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_32'], + ['OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <33> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_33'], + ['OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <34> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_34'], + ['OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <35> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_35'], + ['OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <36> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_36'], + ['OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <37> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_37'], + ['OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <38> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_38'], + ['OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <39> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_39'], + ['OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <40> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_40'], + ['OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <41> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_41'], + ['OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <42> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_42'], + ['OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <43> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_43'], + ['OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <44> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_44'], + ['OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <45> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_45'], + ['OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <46> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_46'], + ['OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <47> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_47'], + ['OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <48> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_48'], + ['OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <49> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_49'], + ['OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <50> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_50'], + ['OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <51> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_51'], + ['OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <52> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_52'], + ['OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <53> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_53'], + ['OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <54> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_54'], + ['OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <55> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_55'], + ['OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <56> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_56'], + ['OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <57> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_57'], + ['OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <58> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_58'], + ['OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <59> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_59'], + ['OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <60> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_60'], + ['OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <61> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_61'], + ['OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <62> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_62'], + ['OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <63> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_63'], + ['OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <64> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_64'], + ['OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <65> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_65'], + ['OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <66> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_66'], + ['OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <67> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_67'], + ['OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <68> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_68'], + ['OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <69> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_69'], + ['OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <70> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_70'], + ['OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <71> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_71'], + ['OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <72> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_72'], + ['OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <73> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_73'], + ['OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <74> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_74'], + ['OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'OP_SIZE <75> OP_EQUAL OP_NIP', 'OP_PUSHBYTES_75'], + ['OP_PUSHBYTES_1', 'OP_SIZE <1> OP_EQUAL', 'OP_PUSHBYTES_1 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_2 0x00', 'OP_SIZE <2> OP_EQUAL', 'OP_PUSHBYTES_2 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_3 0x00', 'OP_SIZE <3> OP_EQUAL', 'OP_PUSHBYTES_3 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_4 0x00', 'OP_SIZE <4> OP_EQUAL', 'OP_PUSHBYTES_4 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_5 0x00', 'OP_SIZE <5> OP_EQUAL', 'OP_PUSHBYTES_5 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_6 0x00', 'OP_SIZE <6> OP_EQUAL', 'OP_PUSHBYTES_6 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_7 0x00', 'OP_SIZE <7> OP_EQUAL', 'OP_PUSHBYTES_7 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_8 0x00', 'OP_SIZE <8> OP_EQUAL', 'OP_PUSHBYTES_8 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_9 0x00', 'OP_SIZE <9> OP_EQUAL', 'OP_PUSHBYTES_9 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_10 0x00', 'OP_SIZE <10> OP_EQUAL', 'OP_PUSHBYTES_10 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_11 0x00', 'OP_SIZE <11> OP_EQUAL', 'OP_PUSHBYTES_11 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_12 0x00', 'OP_SIZE <12> OP_EQUAL', 'OP_PUSHBYTES_12 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_13 0x00', 'OP_SIZE <13> OP_EQUAL', 'OP_PUSHBYTES_13 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_14 0x00', 'OP_SIZE <14> OP_EQUAL', 'OP_PUSHBYTES_14 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_15 0x00', 'OP_SIZE <15> OP_EQUAL', 'OP_PUSHBYTES_15 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_16 0x00', 'OP_SIZE <16> OP_EQUAL', 'OP_PUSHBYTES_16 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_17 0x00', 'OP_SIZE <17> OP_EQUAL', 'OP_PUSHBYTES_17 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_18 0x00', 'OP_SIZE <18> OP_EQUAL', 'OP_PUSHBYTES_18 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_19 0x00', 'OP_SIZE <19> OP_EQUAL', 'OP_PUSHBYTES_19 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_20 0x00', 'OP_SIZE <20> OP_EQUAL', 'OP_PUSHBYTES_20 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_21 0x00', 'OP_SIZE <21> OP_EQUAL', 'OP_PUSHBYTES_21 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_22 0x00', 'OP_SIZE <22> OP_EQUAL', 'OP_PUSHBYTES_22 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_23 0x00', 'OP_SIZE <23> OP_EQUAL', 'OP_PUSHBYTES_23 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_24 0x00', 'OP_SIZE <24> OP_EQUAL', 'OP_PUSHBYTES_24 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_25 0x00', 'OP_SIZE <25> OP_EQUAL', 'OP_PUSHBYTES_25 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_26 0x00', 'OP_SIZE <26> OP_EQUAL', 'OP_PUSHBYTES_26 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_27 0x00', 'OP_SIZE <27> OP_EQUAL', 'OP_PUSHBYTES_27 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_28 0x00', 'OP_SIZE <28> OP_EQUAL', 'OP_PUSHBYTES_28 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_29 0x00', 'OP_SIZE <29> OP_EQUAL', 'OP_PUSHBYTES_29 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_30 0x00', 'OP_SIZE <30> OP_EQUAL', 'OP_PUSHBYTES_30 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_31 0x00', 'OP_SIZE <31> OP_EQUAL', 'OP_PUSHBYTES_31 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_32 0x00', 'OP_SIZE <32> OP_EQUAL', 'OP_PUSHBYTES_32 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_33 0x00', 'OP_SIZE <33> OP_EQUAL', 'OP_PUSHBYTES_33 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_34 0x00', 'OP_SIZE <34> OP_EQUAL', 'OP_PUSHBYTES_34 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_35 0x00', 'OP_SIZE <35> OP_EQUAL', 'OP_PUSHBYTES_35 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_36 0x00', 'OP_SIZE <36> OP_EQUAL', 'OP_PUSHBYTES_36 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_37 0x00', 'OP_SIZE <37> OP_EQUAL', 'OP_PUSHBYTES_37 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_38 0x00', 'OP_SIZE <38> OP_EQUAL', 'OP_PUSHBYTES_38 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_39 0x00', 'OP_SIZE <39> OP_EQUAL', 'OP_PUSHBYTES_39 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_40 0x00', 'OP_SIZE <40> OP_EQUAL', 'OP_PUSHBYTES_40 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_41 0x00', 'OP_SIZE <41> OP_EQUAL', 'OP_PUSHBYTES_41 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_42 0x00', 'OP_SIZE <42> OP_EQUAL', 'OP_PUSHBYTES_42 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_43 0x00', 'OP_SIZE <43> OP_EQUAL', 'OP_PUSHBYTES_43 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_44 0x00', 'OP_SIZE <44> OP_EQUAL', 'OP_PUSHBYTES_44 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_45 0x00', 'OP_SIZE <45> OP_EQUAL', 'OP_PUSHBYTES_45 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_46 0x00', 'OP_SIZE <46> OP_EQUAL', 'OP_PUSHBYTES_46 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_47 0x00', 'OP_SIZE <47> OP_EQUAL', 'OP_PUSHBYTES_47 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_48 0x00', 'OP_SIZE <48> OP_EQUAL', 'OP_PUSHBYTES_48 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_49 0x00', 'OP_SIZE <49> OP_EQUAL', 'OP_PUSHBYTES_49 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_50 0x00', 'OP_SIZE <50> OP_EQUAL', 'OP_PUSHBYTES_50 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_51 0x00', 'OP_SIZE <51> OP_EQUAL', 'OP_PUSHBYTES_51 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_52 0x00', 'OP_SIZE <52> OP_EQUAL', 'OP_PUSHBYTES_52 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_53 0x00', 'OP_SIZE <53> OP_EQUAL', 'OP_PUSHBYTES_53 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_54 0x00', 'OP_SIZE <54> OP_EQUAL', 'OP_PUSHBYTES_54 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_55 0x00', 'OP_SIZE <55> OP_EQUAL', 'OP_PUSHBYTES_55 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_56 0x00', 'OP_SIZE <56> OP_EQUAL', 'OP_PUSHBYTES_56 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_57 0x00', 'OP_SIZE <57> OP_EQUAL', 'OP_PUSHBYTES_57 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_58 0x00', 'OP_SIZE <58> OP_EQUAL', 'OP_PUSHBYTES_58 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_59 0x00', 'OP_SIZE <59> OP_EQUAL', 'OP_PUSHBYTES_59 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_60 0x00', 'OP_SIZE <60> OP_EQUAL', 'OP_PUSHBYTES_60 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_61 0x00', 'OP_SIZE <61> OP_EQUAL', 'OP_PUSHBYTES_61 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_62 0x00', 'OP_SIZE <62> OP_EQUAL', 'OP_PUSHBYTES_62 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_63 0x00', 'OP_SIZE <63> OP_EQUAL', 'OP_PUSHBYTES_63 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_64 0x00', 'OP_SIZE <64> OP_EQUAL', 'OP_PUSHBYTES_64 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_65 0x00', 'OP_SIZE <65> OP_EQUAL', 'OP_PUSHBYTES_65 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_66 0x00', 'OP_SIZE <66> OP_EQUAL', 'OP_PUSHBYTES_66 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_67 0x00', 'OP_SIZE <67> OP_EQUAL', 'OP_PUSHBYTES_67 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_68 0x00', 'OP_SIZE <68> OP_EQUAL', 'OP_PUSHBYTES_68 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_69 0x00', 'OP_SIZE <69> OP_EQUAL', 'OP_PUSHBYTES_69 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_70 0x00', 'OP_SIZE <70> OP_EQUAL', 'OP_PUSHBYTES_70 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_71 0x00', 'OP_SIZE <71> OP_EQUAL', 'OP_PUSHBYTES_71 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_72 0x00', 'OP_SIZE <72> OP_EQUAL', 'OP_PUSHBYTES_72 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_73 0x00', 'OP_SIZE <73> OP_EQUAL', 'OP_PUSHBYTES_73 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_74 0x00', 'OP_SIZE <74> OP_EQUAL', 'OP_PUSHBYTES_74 with missing bytes', ['invalid']], + ['OP_PUSHBYTES_75 0x00', 'OP_SIZE <75> OP_EQUAL', 'OP_PUSHBYTES_75 with missing bytes', ['invalid']], + ], + ], + // TODO: OP_PUSHDATA_1, OP_PUSHDATA_2, OP_PUSHDATA_4 + + // TODO: also test all push opcodes in locking bytecode + [ + 'Push number operations (OP_1NEGATE-OP_16)', + [ + ['OP_1NEGATE', '<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_1NEGATE pushes 0x81.'], + ['OP_0', '<0x00> OP_CAT <0x00> OP_EQUAL', 'OP_0 pushes an empty stack item.'], + ['OP_1', '<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_1 pushes 0x01.'], + ['OP_2', '<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_2 pushes 0x02.'], + ['OP_3', '<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_3 pushes 0x03.'], + ['OP_4', '<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_4 pushes 0x04.'], + ['OP_5', '<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_5 pushes 0x05.'], + ['OP_6', '<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_6 pushes 0x06.'], + ['OP_7', '<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_7 pushes 0x07.'], + ['OP_8', '<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_8 pushes 0x08.'], + ['OP_9', '<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_9 pushes 0x09.'], + ['OP_10', '<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_10 pushes 0x0a.'], + ['OP_11', '<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_11 pushes 0x0b.'], + ['OP_12', '<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_12 pushes 0x0c.'], + ['OP_13', '<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_13 pushes 0x0d.'], + ['OP_14', '<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_14 pushes 0x0e.'], + ['OP_15', '<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_15 pushes 0x0f.'], + ['OP_16', '<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL', 'OP_16 pushes 0x10.'], + ], + ], + [ + 'Standard transaction inputs may only include push operations', + [ + ['<0> OP_IF OP_RESERVED OP_ENDIF', '<1>', 'OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not)', ['valid']], + ['<1> OP_IF OP_RESERVED OP_ENDIF', '<1>', 'OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not)', ['invalid']], + ['OP_NOP', '<1>', 'OP_NOP is non-standard in unlocking bytecode', ['valid']], + // TODO: ensure all non-push opcodes are non-standard when found in unlocking bytecode + ], + ], + [ + 'Disabled/failing operations', + [ + // TODO: all OP_UNKNOWNs + ['<0>', 'OP_IF OP_RESERVED OP_ENDIF <1>', 'OP_RESERVED is standard if not executed', []], + ['<1>', 'OP_IF OP_RESERVED OP_ENDIF <1>', 'OP_RESERVED fails evaluation if executed', ['invalid']], + ['<0>', 'OP_IF OP_VER OP_ENDIF <1>', 'OP_VER is standard if not executed', []], + ['<1>', 'OP_IF OP_VER OP_ENDIF <1>', 'OP_VER fails evaluation if executed', ['invalid']], + ['<0>', 'OP_IF OP_VERIF OP_ENDIF <1>', 'OP_VERIF fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_VERNOTIF OP_ENDIF <1>', 'OP_VERNOTIF fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_RETURN OP_ENDIF <1>', 'OP_RETURN is standard if not executed', []], + ['<1>', 'OP_IF OP_RETURN OP_ENDIF <1>', 'OP_RETURN fails evaluation if executed', ['invalid']], + ['<0>', 'OP_IF OP_INVERT OP_ENDIF <1>', 'OP_INVERT fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_RESERVED1 OP_ENDIF <1>', 'OP_RESERVED1 is standard if not executed', []], + ['<1>', 'OP_IF OP_RESERVED1 OP_ENDIF <1>', 'OP_RESERVED1 fails evaluation if executed', ['invalid']], + ['<0>', 'OP_IF OP_RESERVED2 OP_ENDIF <1>', 'OP_RESERVED2 is standard if not executed', []], + ['<1>', 'OP_IF OP_RESERVED2 OP_ENDIF <1>', 'OP_RESERVED2 fails evaluation if executed', ['invalid']], + ['<0>', 'OP_IF OP_2MUL OP_ENDIF <1>', 'OP_2MUL fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_2DIV OP_ENDIF <1>', 'OP_2DIV fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_LSHIFT OP_ENDIF <1>', 'OP_LSHIFT fails evaluation even if not executed', ['invalid']], + ['<0>', 'OP_IF OP_RSHIFT OP_ENDIF <1>', 'OP_RSHIFT fails evaluation even if not executed', ['invalid']], + ], + ], + [ + 'OP_NOP1-OP_NOP10 expansion range', + [ + ['<1>', 'OP_NOP1', 'OP_NOP1 is non-standard', ['valid']], + ['<1>', 'OP_NOP4', 'OP_NOP4 is non-standard', ['valid']], + ['<1>', 'OP_NOP5', 'OP_NOP5 is non-standard', ['valid']], + ['<1>', 'OP_NOP6', 'OP_NOP6 is non-standard', ['valid']], + ['<1>', 'OP_NOP7', 'OP_NOP7 is non-standard', ['valid']], + ['<1>', 'OP_NOP8', 'OP_NOP8 is non-standard', ['valid']], + ['<1>', 'OP_NOP9', 'OP_NOP9 is non-standard', ['valid']], + ['<1>', 'OP_NOP10', 'OP_NOP10 is non-standard', ['valid']], + ], + ], + [ + 'Conditionally executed operations', + [ + // TODO: all other conditional operations + ['<0>', 'OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL', 'OP_TXVERSION is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL', 'OP_UTXOVALUE is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL', 'OP_UTXOBYTECODE is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL', 'OP_OUTPOINTTXHASH is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL', 'OP_OUTPOINTINDEX is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL', 'OP_INPUTBYTECODE is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL', 'OP_INPUTSEQUENCENUMBER is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE is conditionally executed', ['2021_invalid']], + ['<0>', 'OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL', 'OP_OUTPUTBYTECODE is conditionally executed', ['2021_invalid']], + ], + ], + [ + 'Operations copy by value', + [ + // TODO: all other operations that push + ['<1>', 'OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_INPUTINDEX pushes an independent stack item', ['2021_invalid']], + ['<1>', 'OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY', 'each OP_ACTIVEBYTECODE pushes an independent stack item', ['2021_invalid']], + ['<1>', 'OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_TXVERSION pushes an independent stack item', ['2021_invalid']], + ['<1>', 'OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_TXINPUTCOUNT pushes an independent stack item', ['2021_invalid']], + ['<1>', 'OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_TXOUTPUTCOUNT pushes an independent stack item', ['2021_invalid']], + ['<1>', 'OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_TXLOCKTIME pushes an independent stack item', ['2021_invalid']], + ['<1>', '<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_UTXOVALUE pushes an independent stack item', ['2021_invalid']], + ['<1>', '<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY', 'each OP_UTXOBYTECODE pushes an independent stack item', ['2021_invalid']], + ['<1>', '<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY', 'each OP_OUTPOINTTXHASH pushes an independent stack item', ['2021_invalid']], + ['<1>', '<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_OUTPOINTINDEX pushes an independent stack item', ['2021_invalid']], + ['<1>', '<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY', 'each OP_INPUTBYTECODE pushes an independent stack item', ['2021_invalid']], + ['<1>', '<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_INPUTSEQUENCENUMBER pushes an independent stack item', ['2021_invalid']], + ['<1>', '<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY', 'each OP_OUTPUTVALUE pushes an independent stack item', ['2021_invalid']], + ['<1>', '<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY', 'each OP_OUTPUTBYTECODE pushes an independent stack item', ['2021_invalid']], + ], + ], + [ + 'Transaction inspection', + [ + ['<0>', 'OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX returns the index of the input currently being evaluated (0)', ['2021_invalid'], slot0Scenario], + ['<0>', 'OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0)', ['invalid']], + ['<1>', 'OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX returns the index of the input currently being evaluated (1)', ['2021_invalid']], + ['<2>', 'OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX returns the index of the input currently being evaluated (2)', ['2021_invalid'], slot2Scenario], + ['<9>', 'OP_INPUTINDEX OP_EQUAL', 'OP_INPUTINDEX returns the index of the input currently being evaluated (9)', ['2021_invalid'], slot9Scenario], + ['', 'OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE returns the bytecode currently being evaluated', ['2021_invalid']], + [' OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>', 'OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size)', ['2021_invalid']], + [' OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>', 'OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR)', ['2021_invalid']], + ['', 'OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE respects OP_CODESEPARATOR', ['2021_invalid']], + ['', 'OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL', 'OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY)', ['2021_invalid']], + ['', 'OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL', 'Active bytecode begins after the last OP_CODESEPARATOR', ['invalid']], + ['', 'OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL', 'OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR', ['2021_invalid']], + [ + ' ', + 'OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL', + 'OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs)', + ['2021_invalid'], + ], + [ + ' ', + 'OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL', + 'OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs', + ['2021_invalid'], + ], + ['<1>', 'OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY', '"OP_INPUTINDEX OP_UTXOBYTECODE" and "OP_ACTIVEBYTECODE" differ in P2SH contracts (working nonP2SH)', ['2021_invalid', 'p2sh_invalid']], + ['', 'OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL', '"OP_INPUTINDEX OP_UTXOBYTECODE" and "OP_ACTIVEBYTECODE" differ in P2SH contracts (working P2SH)', ['2021_invalid', 'nonP2sh_invalid']], + ['<0>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 0)', ['2021_invalid', '2022_valid'], { transaction: { version: 0 } }], + ['<1>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 1)', ['2021_invalid'], { transaction: { version: 1 } }], + ['<2>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 2)', ['2021_invalid']], + ['<3>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 2, while version 3 is expected)', ['invalid']], + ['<3>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 3)', ['2021_invalid', '2022_valid'], { transaction: { version: 3 } }], + ['<123456>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 123456)', ['2021_invalid', '2022_valid'], { transaction: { version: 123456 } }], + ['<4294967294>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 4294967294)', ['2021_invalid', '2022_valid'], { transaction: { version: 4294967294 } }], + ['<4294967295>', 'OP_TXVERSION OP_EQUAL', 'OP_TXVERSION (version == 4294967295)', ['2021_invalid', '2022_valid'], { transaction: { version: 4294967295 } }], + ['<2>', 'OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (2 inputs)', ['2021_invalid']], + ['<1>', 'OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (2 inputs, 1 expected)', ['invalid']], + ['<1> <"100-byte tx size minimum 123456789012345678901234567890">', 'OP_DROP OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (1 input)', ['2021_invalid'], { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }] } }], + ['<3>', 'OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (3 inputs)', ['2021_invalid'], slot2Scenario], + ['<10>', 'OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (10 inputs)', ['2021_invalid'], slot9Scenario], + ['<101>', 'OP_TXINPUTCOUNT OP_EQUAL', 'OP_TXINPUTCOUNT (101 inputs)', ['2021_invalid'], { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(100).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(100).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }], + ['<1>', 'OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT (1 output)', ['2021_invalid']], + ['<2>', 'OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT (2 outputs)', ['2021_invalid'], { transaction: { outputs: [...range(2).map(() => ({ lockingBytecode: { script: 'vmbTestNullData' } }))] } }], + ['<3>', 'OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT (3 outputs)', ['2021_invalid'], { transaction: { outputs: [...range(3).map(() => ({ lockingBytecode: { script: 'vmbTestNullData' } }))] } }], + ['<20>', 'OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT (20 outputs)', ['2021_invalid'], { transaction: { outputs: [...range(20).map(() => ({ lockingBytecode: { script: 'vmbTestNullData' } }))] } }], + ['<100>', 'OP_TXOUTPUTCOUNT OP_EQUAL', 'OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit)', ['2021_invalid', '2022_valid'], { transaction: { outputs: [...range(100).map(() => ({ lockingBytecode: { script: 'vmbTestNullData' } }))] } }], + ['<0>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 0)', ['2021_invalid']], + ['<1>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 0, but expects 1)', ['invalid']], + ['<1>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 1)', ['2021_invalid'], { transaction: { locktime: 1 } }], + ['<2>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 2)', ['2021_invalid'], { transaction: { locktime: 2 } }], + ['<499_999_999>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 499999999, the maximum block height)', ['2021_invalid'], { transaction: { locktime: 499_999_999 } }], + ['<500_000_000>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp)', ['2021_invalid'], { transaction: { locktime: 500_000_000 } }], + ['<4_294_967_294>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 4294967294)', ['2021_invalid'], { transaction: { locktime: 4_294_967_294 } }], + ['<4_294_967_295>', 'OP_TXLOCKTIME OP_EQUAL', 'OP_TXLOCKTIME (locktime == 4294967295)', ['2021_invalid'], { transaction: { locktime: 4_294_967_295 } }], + ['<10_000> <0>', 'OP_UTXOVALUE OP_EQUAL', 'OP_UTXOVALUE (10000)', ['2021_invalid']], + ['<10_001> <0>', 'OP_UTXOVALUE OP_EQUAL', 'OP_UTXOVALUE (10000, expects 10001)', ['invalid']], + ['<1>', '<0> OP_UTXOVALUE OP_DROP', 'OP_UTXOVALUE (ignore result)', ['2021_invalid']], + ['<1>', '<1> OP_UTXOVALUE OP_DROP', 'OP_UTXOVALUE (ignore result, index 1)', ['2021_invalid']], + ['<1>', '<-1> OP_UTXOVALUE OP_DROP', 'OP_UTXOVALUE (ignore result, negative index)', ['invalid']], + ['<1>', '<0x0100> OP_UTXOVALUE OP_DROP', 'OP_UTXOVALUE (ignore result, index 1, non-minimally encoded)', ['invalid']], + ['<1>', '<2> OP_UTXOVALUE OP_DROP', 'OP_UTXOVALUE (ignore result, index 2, greater than maximum index)', ['invalid']], + ['<10_000> <1>', 'OP_UTXOVALUE OP_EQUAL', 'OP_UTXOVALUE (10000; input 1)', ['2021_invalid']], + [ + '<123_456> <100>', + 'OP_UTXOVALUE OP_EQUAL', + 'OP_UTXOVALUE (123456; input 101)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(100).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 123_456 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(100).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + ['<123_456_789> <0>', 'OP_UTXOVALUE OP_EQUAL', 'OP_UTXOVALUE (1.23456789 BCH)', ['2021_invalid'], { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 123_456_789 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_RETURN <"100-byte tx size minimum 1234567">') as Uint8Array) }] } }], + [ + '<2_100_000_000_000_000> <0>', + 'OP_UTXOVALUE OP_EQUAL', + 'OP_UTXOVALUE (21,000,000 BCH)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt(21_000_000) * BigInt(100_000_000))) }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_RETURN <"100-byte tx size minimum 1234">') as Uint8Array) }] } }, + ], + [ + '<9223372036854775807> <0>', + 'OP_UTXOVALUE OP_EQUAL', + 'OP_UTXOVALUE (maximum VM Number satoshis)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt('9223372036854775807'))) }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_RETURN <"100-byte tx size minimum 123">') as Uint8Array) }] } }, + ], + [ + '<9223372036854775808> <0>', + 'OP_UTXOVALUE OP_EQUAL', + 'OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number)', + ['invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt('9223372036854775808'))) }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_RETURN <"100-byte tx size minimum 123">') as Uint8Array) }] } }, + ], + ['<<1> OP_UTXOBYTECODE OP_EQUAL>', '<1> OP_UTXOBYTECODE OP_EQUAL', 'OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH)', ['2021_invalid', 'p2sh_invalid']], + ['<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>', '<1> OP_UTXOBYTECODE OP_EQUAL', 'OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20)', ['2021_invalid', 'nonP2sh20_invalid']], + ['<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>', '<0> OP_UTXOBYTECODE OP_EQUAL', 'OP_UTXOBYTECODE (; input 0)', ['2021_invalid']], + ['<1>', '<0> OP_UTXOBYTECODE OP_DROP', 'OP_UTXOBYTECODE (ignore result, input 0)', ['2021_invalid']], + ['<1>', '<1> OP_UTXOBYTECODE OP_DROP', 'OP_UTXOBYTECODE (ignore result, input 1)', ['2021_invalid']], + ['<1>', '<-1> OP_UTXOBYTECODE OP_DROP', 'OP_UTXOBYTECODE (ignore result, negative input)', ['invalid']], + ['<1>', '<0x0100> OP_UTXOBYTECODE OP_DROP', 'OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded)', ['invalid']], + ['<1>', '<2> OP_UTXOBYTECODE OP_DROP', 'OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index)', ['invalid']], + [ + `<<0x${range(513) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL>`, + `<0x${range(513) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL`, + 'OP_UTXOBYTECODE (maximum size UTXO bytecode)', + ['2021_invalid', 'p2sh_ignore'], + ], + [ + '<1>', + `<0x${range(513) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}> OP_DROP <1> OP_UTXOBYTECODE OP_DROP`, + 'OP_UTXOBYTECODE (ignore result, not excessive size)', + ['2021_invalid', 'p2sh_ignore'], + ], + [ + '<1>', + `<0x${range(514) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}> OP_DROP <1> OP_UTXOBYTECODE OP_DROP`, + 'OP_UTXOBYTECODE (ignore result, excessive size)', + ['invalid', 'p2sh_ignore'], + ], + [ + '<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>', + `<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL`, + 'multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs)', + ['invalid', '2022_nonP2sh_valid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ lockingBytecode: { script: `lock${i}` }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ unlockingBytecode: { script: `unlock${i}` } }))] } }, + range(49, 1).reduce((agg, i) => ({ ...agg, [`unlock${i}`]: { script: `<0x00 ${i}>`, unlocks: `lock${i}` }, [`lock${i}`]: { lockingType: 'standard', script: `<0x00 ${i}> OP_EQUAL` } }), {}), + ], + [ + ' OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>', + `<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL`, + 'multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction)', + ['invalid', '2022_p2sh_standard'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ lockingBytecode: { script: `lock${i}` }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ unlockingBytecode: { script: `unlock${i}` } }))] } }, + range(49, 1).reduce((agg, i) => ({ ...agg, [`unlock${i}`]: { script: `<0x00 ${i}>`, unlocks: `lock${i}` }, [`lock${i}`]: { lockingType: 'p2sh20', script: `<0x00 ${i}> OP_EQUAL` } }), {}), + ], + ['<0x0000000000000000000000000000000000000000000000000000000000000000>', '<0> OP_OUTPOINTTXHASH OP_EQUAL', 'OP_OUTPOINTTXHASH (input 0)', ['2021_invalid']], + ['<0x0000000000000000000000000000000000000000000000000000000000000000>', '<1> OP_OUTPOINTTXHASH OP_EQUAL', 'OP_OUTPOINTTXHASH (input 1)', ['2021_invalid']], + ['<0x0000000000000000000000000000000000000000000000000000000000000001>', '<1> OP_OUTPOINTTXHASH OP_EQUAL', 'OP_OUTPOINTTXHASH (input 1, expected 0x00...01)', ['invalid']], + [ + '<0x0000000000000000000000000000000000000000000000000000000000000001>', + '<1> OP_OUTPOINTTXHASH OP_EQUAL', + 'OP_OUTPOINTTXHASH (input 1, 0x00...01)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { outpointTransactionHash: '0000000000000000000000000000000000000000000000000000000000000001', unlockingBytecode: { script: 'unlockEmptyP2sh20' } }] } }, + ], + ['<1>', '<0> OP_OUTPOINTTXHASH OP_DROP', 'OP_OUTPOINTTXHASH (ignore result, input 0)', ['2021_invalid']], + ['<1>', '<1> OP_OUTPOINTTXHASH OP_DROP', 'OP_OUTPOINTTXHASH (ignore result, input 1)', ['2021_invalid']], + ['<1>', '<0x0100> OP_OUTPOINTTXHASH OP_DROP', 'OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_OUTPOINTTXHASH OP_DROP', 'OP_OUTPOINTTXHASH (ignore result, negative input)', ['invalid']], + ['<1>', '<2> OP_OUTPOINTTXHASH OP_DROP', 'OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input)', ['invalid']], + [ + '<1>', + '<2> OP_OUTPOINTTXHASH OP_DROP', + 'OP_OUTPOINTTXHASH (ignore result, input 2)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(2).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(2).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + [ + '<42> <13> <3>', + '<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL', + 'multiple OP_OUTPOINTTXHASHs (50 inputs)', + ['2021_invalid'], + { + sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], + transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ outpointTransactionHash: `${binToHex(Uint8Array.of(i))}00000000000000000000000000000000000000000000000000000000000000`, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] }, + }, + ], + ['<0>', '<0> OP_OUTPOINTINDEX OP_EQUAL', 'OP_OUTPOINTINDEX (input 0)', ['2021_invalid']], + ['<1>', '<1> OP_OUTPOINTINDEX OP_EQUAL', 'OP_OUTPOINTINDEX (input 1)', ['2021_invalid']], + ['<0>', '<1> OP_OUTPOINTINDEX OP_EQUAL', 'OP_OUTPOINTINDEX (input 1, expected 0)', ['invalid']], + ['<1>', '<1> OP_OUTPOINTINDEX OP_EQUAL', 'OP_OUTPOINTINDEX (input 1, 1)', ['2021_invalid'], { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { outpointIndex: 1, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }] } }], + ['<1>', '<0> OP_OUTPOINTINDEX OP_DROP', 'OP_OUTPOINTINDEX (ignore result, input 0)', ['2021_invalid']], + ['<1>', '<1> OP_OUTPOINTINDEX OP_DROP', 'OP_OUTPOINTINDEX (ignore result, input 1)', ['2021_invalid']], + ['<1>', '<0x0100> OP_OUTPOINTINDEX OP_DROP', 'OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_OUTPOINTINDEX OP_DROP', 'OP_OUTPOINTINDEX (ignore result, negative input)', ['invalid']], + ['<1>', '<2> OP_OUTPOINTINDEX OP_DROP', 'OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index)', ['invalid']], + [ + '<1>', + '<2> OP_OUTPOINTINDEX OP_DROP', + 'OP_OUTPOINTINDEX (ignore result, input 2)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(2).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(2).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + [ + '<42> <13> <3>', + '<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL', + 'multiple OP_OUTPOINTINDEXs (50 inputs)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ outpointIndex: i, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + ['<0>', 'OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL', 'OP_INPUTBYTECODE (input 0)', ['2021_invalid']], + ['<1>', 'OP_INPUTBYTECODE <<1>> OP_EQUAL', 'OP_INPUTBYTECODE (self, nonP2SH)', ['invalid', '2022_nonP2sh_valid']], + ['<1> OP_CODESEPARATOR <1>', 'OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL', 'OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH)', ['invalid', '2022_nonP2sh_valid']], + [' OP_INPUTBYTECODE OP_EQUALVERIFY <1>>', 'OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>', 'OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20)', ['invalid', '2022_p2sh_standard']], + ['<1>', 'OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL', 'OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE)', ['invalid', '2022_p2sh_standard']], + ['<1>', 'OP_INPUTBYTECODE <1> OP_EQUAL', 'OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1)', ['invalid']], + ['<1>', '<0> OP_INPUTBYTECODE OP_DROP', 'OP_INPUTBYTECODE (ignore result, input 0)', ['2021_invalid']], + ['<1>', '<1> OP_INPUTBYTECODE OP_DROP', 'OP_INPUTBYTECODE (ignore result, input 1)', ['2021_invalid']], + ['<1>', '<0x0100> OP_INPUTBYTECODE OP_DROP', 'OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_INPUTBYTECODE OP_DROP', 'OP_INPUTBYTECODE (ignore result, negative input)', ['invalid']], + ['<1>', '<2> OP_INPUTBYTECODE OP_DROP', 'OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index)', ['invalid']], + [ + '<1>', + '<2> OP_INPUTBYTECODE OP_DROP', + 'OP_INPUTBYTECODE (ignore result, input 2)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(2).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(2).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + [ + '<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>', + `<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL`, + 'multiple OP_INPUTBYTECODEs (50 inputs)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ lockingBytecode: { script: `lock${i}` }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ unlockingBytecode: { script: `unlock${i}` } }))] } }, + range(49, 1).reduce((agg, i) => ({ ...agg, [`unlock${i}`]: { script: `<0x00 ${i}>`, unlocks: `lock${i}` }, [`lock${i}`]: { lockingType: 'p2sh20', script: `<0x00 ${i}> OP_EQUAL` } }), {}), + ], + [ + `<0x${range(517) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>`, + `<<0x${range(517) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP`, + 'OP_INPUTBYTECODE (maximum size)', + ['2021_invalid', 'p2sh_ignore'], + ], + [ + `<0x${range(518) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>`, + `<<0x${range(518) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP`, + 'OP_INPUTBYTECODE (excessive size)', + ['invalid', 'p2sh_ignore'], + ], + [ + `<1> <0x${range(511) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>`, + `OP_DROP <1> OP_INPUTBYTECODE OP_DROP`, + 'OP_INPUTBYTECODE (ignore result, not excessive size)', + ['2021_invalid'], + ], + [ + `<1> <0x${range(518) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>`, + `OP_DROP <1> OP_INPUTBYTECODE OP_DROP`, + 'OP_INPUTBYTECODE (ignore result, excessive size)', + ['invalid'], + ], + ['<0>', '<0> OP_INPUTSEQUENCENUMBER OP_EQUAL', 'OP_INPUTSEQUENCENUMBER (input 0)', ['2021_invalid']], + ['<0>', '<1> OP_INPUTSEQUENCENUMBER OP_EQUAL', 'OP_INPUTSEQUENCENUMBER (input 1)', ['2021_invalid']], + ['<1>', '<1> OP_INPUTSEQUENCENUMBER OP_EQUAL', 'OP_INPUTSEQUENCENUMBER (input 1, expected 1)', ['invalid']], + ['<1>', '<1> OP_INPUTSEQUENCENUMBER OP_EQUAL', 'OP_INPUTSEQUENCENUMBER (input 1, 1)', ['2021_invalid'], { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { sequenceNumber: 1, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }] } }], + [ + '<4294967295>', + '<0> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ sequenceNumber: 4294967295, unlockingBytecode: ['slot'] }, { unlockingBytecode: { script: 'unlockEmptyP2sh20' } }] } }, + ], + [ + '<4294967294>', + '<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled)', + ['2021_invalid'], + { + sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], + transaction: { + inputs: [{ sequenceNumber: 4294967294, unlockingBytecode: ['slot'] }, { unlockingBytecode: { script: 'unlockEmptyP2sh20' } }], + locktime: 1, + }, + }, + ], + [ + '<4294967295>', + '<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure)', + ['invalid'], + { + sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], + transaction: { + inputs: [{ sequenceNumber: 4294967295, unlockingBytecode: ['slot'] }, { unlockingBytecode: { script: 'unlockEmptyP2sh20' } }], + locktime: 1, + }, + }, + ], + [ + '<4294967295>', + '<1> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { sequenceNumber: 4294967295, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }] } }, + ], + [ + '<4294967294>', + '<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { sequenceNumber: 4294967294, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }], locktime: 1 } }, + ], + [ + '<4294967295>', + '<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, { sequenceNumber: 4294967295, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }], locktime: 1 } }, + ], + ['<1>', '<0> OP_INPUTSEQUENCENUMBER OP_DROP', 'OP_INPUTSEQUENCENUMBER (ignore result, input 0)', ['2021_invalid']], + ['<1>', '<1> OP_INPUTSEQUENCENUMBER OP_DROP', 'OP_INPUTSEQUENCENUMBER (ignore result, input 1)', ['2021_invalid']], + ['<1>', '<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP', 'OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_INPUTSEQUENCENUMBER OP_DROP', 'OP_INPUTSEQUENCENUMBER (ignore result, negative input)', ['invalid']], + ['<1>', '<2> OP_INPUTSEQUENCENUMBER OP_DROP', 'OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index)', ['invalid']], + [ + '<1>', + '<2> OP_INPUTSEQUENCENUMBER OP_DROP', + 'OP_INPUTSEQUENCENUMBER (ignore result, input 2)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(2).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(2).map(() => ({ unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + [ + '<42> <13> <3>', + '<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL', + 'multiple OP_INPUTSEQUENCENUMBERs (50 inputs)', + ['2021_invalid'], + { sourceOutputs: [{ lockingBytecode: ['slot'] }, ...range(49, 1).map(() => ({ lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000 }))], transaction: { inputs: [{ unlockingBytecode: ['slot'] }, ...range(49, 1).map((i) => ({ sequenceNumber: i, unlockingBytecode: { script: 'unlockEmptyP2sh20' } }))] } }, + ], + ['<0>', '<0> OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (output 0)', ['2021_invalid']], + ['<10_000>', '<0> OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (output 0, expected 10_000)', ['invalid']], + ['<10_000>', '<0> OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (output 0, 10_000)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }] } }], + ['<1>', '<0> OP_OUTPUTVALUE OP_DROP', 'OP_OUTPUTVALUE (ignore result, output 0)', ['2021_invalid']], + ['<1>', '<0x0000> OP_OUTPUTVALUE OP_DROP', 'OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_OUTPUTVALUE OP_DROP', 'OP_OUTPUTVALUE (ignore result, negative output)', ['invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }] } }], + ['<1>', '<2> OP_OUTPUTVALUE OP_DROP', 'OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index)', ['invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }] } }], + ['<1>', '<2> OP_OUTPUTVALUE OP_DROP', 'OP_OUTPUTVALUE (ignore result, output 2)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }, { valueSatoshis: 10_002 }] } }], + ['<10_042> <10_013> <10_007> <10_001>', `<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL`, 'multiple OP_OUTPUTVALUEs (50 inputs)', ['2021_invalid'], { transaction: { outputs: [...range(50).map((i) => ({ valueSatoshis: 10_000 + i }))] } }], + ['<123_456_789> <0>', 'OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (1.23456789 BCH)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: 123_456_789 }] } }], + ['<2_100_000_000_000_000> <0>', 'OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (21,000,000 BCH)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt(21_000_000) * BigInt(100_000_000))) }] } }], + ['<9223372036854775807> <0>', 'OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (maximum VM Number satoshis)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt('9223372036854775807'))) }] } }], + ['<9223372036854775808> <0>', 'OP_OUTPUTVALUE OP_EQUAL', 'OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number)', ['invalid'], { transaction: { outputs: [{ valueSatoshis: binToHex(bigIntToBinUint64LE(BigInt('9223372036854775808'))) }] } }], + ['>', '<0> OP_OUTPUTBYTECODE OP_EQUAL', 'OP_OUTPUTBYTECODE (output 0)', ['2021_invalid']], + ['', '<0> OP_OUTPUTBYTECODE OP_EQUAL', 'OP_OUTPUTBYTECODE (output 0, expected )', ['invalid']], + ['', '<0> OP_OUTPUTBYTECODE OP_EQUAL', 'OP_OUTPUTBYTECODE (output 0, )', ['2021_invalid'], { transaction: { outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_RETURN') as Uint8Array), valueSatoshis: 10_000 }] } }], + ['>', '<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL', 'OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, )', ['2021_invalid', '2022_valid'], { transaction: { outputs: [{ lockingBytecode: binToHex(cashAssemblyToBin('OP_DROP OP_CODESEPARATOR <1>') as Uint8Array), valueSatoshis: 10_000 }] } }], + ['<1>', '<0> OP_OUTPUTBYTECODE OP_DROP', 'OP_OUTPUTBYTECODE (ignore result, output 0)', ['2021_invalid']], + ['<1>', '<0x0000> OP_OUTPUTBYTECODE OP_DROP', 'OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded)', ['invalid']], + ['<1>', '<-1> OP_OUTPUTBYTECODE OP_DROP', 'OP_OUTPUTBYTECODE (ignore result, negative output index)', ['invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }] } }], + ['<1>', '<2> OP_OUTPUTBYTECODE OP_DROP', 'OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index)', ['invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }] } }], + ['<1>', '<2> OP_OUTPUTBYTECODE OP_DROP', 'OP_OUTPUTBYTECODE (ignore result, output 2)', ['2021_invalid'], { transaction: { outputs: [{ valueSatoshis: 10_000 }, { valueSatoshis: 10_001 }, { valueSatoshis: 10_002 }] } }], + [ + '> > > >', + `<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL`, + 'multiple OP_OUTPUTBYTECODEs (50 inputs)', + ['2021_invalid'], + { transaction: { outputs: [...range(50).map((i) => ({ lockingBytecode: binToHex(cashAssemblyToBin(`OP_RETURN <${i}>`) as Uint8Array), valueSatoshis: 10_000 + i }))] } }, + ], + [ + ` binToHex(Uint8Array.of(i))) + .join('')}>>`, + `<0> OP_OUTPUTBYTECODE OP_EQUAL`, + 'OP_OUTPUTBYTECODE (maximum size)', + ['2021_invalid', '2022_valid'], + { + transaction: { + outputs: [ + { + lockingBytecode: binToHex( + cashAssemblyToBin( + `OP_RETURN <0x${range(516) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>` + ) as Uint8Array + ), + }, + ], + }, + }, + ], + [ + ` binToHex(Uint8Array.of(i))) + .join('')}>>`, + `<0> OP_OUTPUTBYTECODE OP_EQUAL`, + 'OP_OUTPUTBYTECODE (excessive size)', + ['invalid'], + { + transaction: { + outputs: [ + { + lockingBytecode: binToHex( + cashAssemblyToBin( + `OP_RETURN <0x${range(517) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>` + ) as Uint8Array + ), + }, + ], + }, + }, + ], + [ + `<1>`, + `<0> OP_OUTPUTBYTECODE OP_DROP`, + 'OP_OUTPUTBYTECODE (ignore result, not excessive size)', + ['2021_invalid', '2022_valid'], + { + transaction: { + outputs: [ + { + lockingBytecode: binToHex( + cashAssemblyToBin( + `OP_RETURN <0x${range(516) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>` + ) as Uint8Array + ), + }, + ], + }, + }, + ], + [ + `<1>`, + `<0> OP_OUTPUTBYTECODE OP_DROP`, + 'OP_OUTPUTBYTECODE (ignore result, excessive size)', + ['invalid'], + { + transaction: { + outputs: [ + { + lockingBytecode: binToHex( + cashAssemblyToBin( + `OP_RETURN <0x${range(517) + .map((i) => binToHex(Uint8Array.of(i))) + .join('')}>` + ) as Uint8Array + ), + }, + ], + }, + }, + ], + ], + ], +]; + +export const vmbTestsBCH = vmbTestDefinitionsBCH.map(vmbTestGroupToVmbTests); diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests.json new file mode 100644 index 00000000..21a5aa13 --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests.json @@ -0,0 +1,783 @@ +[ + ["ste4l", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (nonP2SH)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482008777", ["2021_valid", "2022_valid"], 1], + ["kqlqv", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (P2SH20)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000482008777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91498e86c508e780cfb822bba3d5ab9b3e30450196b87", ["2021_standard", "2022_standard"], 1], + ["6dasr", "Basic push operations: OP_PUSHBYTES_1 (nonP2SH)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482518777", ["2021_valid", "2022_valid"], 1], + ["f6790", "Basic push operations: OP_PUSHBYTES_1 (P2SH20)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000701000482518777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914774415af6b71a5e4aafebe27271713238faef29b87", ["2021_standard", "2022_standard"], 1], + ["52zmt", "Basic push operations: OP_PUSHBYTES_2 (nonP2SH)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003020000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482528777", ["2021_valid", "2022_valid"], 1], + ["642k0", "Basic push operations: OP_PUSHBYTES_2 (P2SH20)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080200000482528777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac980e4b702ffa3f36d97d0a0150b20fca324cfd87", ["2021_standard", "2022_standard"], 1], + ["p423x", "Basic push operations: OP_PUSHBYTES_3 (nonP2SH)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482538777", ["2021_valid", "2022_valid"], 1], + ["wp57c", "Basic push operations: OP_PUSHBYTES_3 (P2SH20)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009030000000482538777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bc84dc62228d6b7c1b5fda70ef20aa281642c25087", ["2021_standard", "2022_standard"], 1], + ["28vzk", "Basic push operations: OP_PUSHBYTES_4 (nonP2SH)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050400000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482548777", ["2021_valid", "2022_valid"], 1], + ["rhufv", "Basic push operations: OP_PUSHBYTES_4 (P2SH20)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a04000000000482548777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914520f81159716d7d4fdba01c9a499d719a1b109a487", ["2021_standard", "2022_standard"], 1], + ["phylh", "Basic push operations: OP_PUSHBYTES_5 (nonP2SH)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482558777", ["2021_valid", "2022_valid"], 1], + ["sydt9", "Basic push operations: OP_PUSHBYTES_5 (P2SH20)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0500000000000482558777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f47df2fd6b5300617883d49f98e06fdc83e938f887", ["2021_standard", "2022_standard"], 1], + ["duvaw", "Basic push operations: OP_PUSHBYTES_6 (nonP2SH)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000706000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482568777", ["2021_valid", "2022_valid"], 1], + ["yszmd", "Basic push operations: OP_PUSHBYTES_6 (P2SH20)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c060000000000000482568777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91427d3e4ba6d657a2802adb4605d6f1b22d8ab03a987", ["2021_standard", "2022_standard"], 1], + ["htnez", "Basic push operations: OP_PUSHBYTES_7 (nonP2SH)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080700000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482578777", ["2021_valid", "2022_valid"], 1], + ["cp088", "Basic push operations: OP_PUSHBYTES_7 (P2SH20)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d07000000000000000482578777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acb9845c4d630864bf618f55594a21f70598546c87", ["2021_standard", "2022_standard"], 1], + ["ycdq3", "Basic push operations: OP_PUSHBYTES_8 (nonP2SH)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009080000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482588777", ["2021_valid", "2022_valid"], 1], + ["5xy5w", "Basic push operations: OP_PUSHBYTES_8 (P2SH20)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0800000000000000000482588777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143187995004a81a0c40c8aee658b94bc067b8c41987", ["2021_standard", "2022_standard"], 1], + ["c20q3", "Basic push operations: OP_PUSHBYTES_9 (nonP2SH)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a09000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482598777", ["2021_valid", "2022_valid"], 1], + ["sgxp5", "Basic push operations: OP_PUSHBYTES_9 (P2SH20)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f090000000000000000000482598777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914051c402d952b9383195a9684874309515ab42d5087", ["2021_standard", "2022_standard"], 1], + ["mlstn", "Basic push operations: OP_PUSHBYTES_10 (nonP2SH)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a00000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825a8777", ["2021_valid", "2022_valid"], 1], + ["f6rhr", "Basic push operations: OP_PUSHBYTES_10 (P2SH20)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100a0000000000000000000004825a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fcfebf7f52d455ece34b52d922eeffe789b4b2f87", ["2021_standard", "2022_standard"], 1], + ["jmjj2", "Basic push operations: OP_PUSHBYTES_11 (nonP2SH)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c0b0000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825b8777", ["2021_valid", "2022_valid"], 1], + ["lqg4v", "Basic push operations: OP_PUSHBYTES_11 (P2SH20)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000110b000000000000000000000004825b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e6a58ca1780653073a7715e6bef9570a42fff99287", ["2021_standard", "2022_standard"], 1], + ["960mz", "Basic push operations: OP_PUSHBYTES_12 (nonP2SH)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d0c000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825c8777", ["2021_valid", "2022_valid"], 1], + ["pzrxc", "Basic push operations: OP_PUSHBYTES_12 (P2SH20)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120c00000000000000000000000004825c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148d3d79625e4f5cc9474d2056fb514dabdbf2853e87", ["2021_standard", "2022_standard"], 1], + ["6w62r", "Basic push operations: OP_PUSHBYTES_13 (nonP2SH)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d00000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825d8777", ["2021_valid", "2022_valid"], 1], + ["ym5tw", "Basic push operations: OP_PUSHBYTES_13 (P2SH20)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000130d0000000000000000000000000004825d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cba13f4df2f3c799be0fda2fda348563fcf3bffc87", ["2021_standard", "2022_standard"], 1], + ["qjm07", "Basic push operations: OP_PUSHBYTES_14 (nonP2SH)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0e0000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825e8777", ["2021_valid", "2022_valid"], 1], + ["4hd9u", "Basic push operations: OP_PUSHBYTES_14 (P2SH20)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000140e000000000000000000000000000004825e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914222ec246a4c5c463d2a2e9f3716d7a858d8b37c687", ["2021_standard", "2022_standard"], 1], + ["q9xzq", "Basic push operations: OP_PUSHBYTES_15 (nonP2SH)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100f000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825f8777", ["2021_valid", "2022_valid"], 1], + ["j5rjr", "Basic push operations: OP_PUSHBYTES_15 (P2SH20)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000150f00000000000000000000000000000004825f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aaf70e5c15367a5802d82aa514f5432e08c583987", ["2021_standard", "2022_standard"], 1], + ["fln49", "Basic push operations: OP_PUSHBYTES_16 (nonP2SH)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000111000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482608777", ["2021_valid", "2022_valid"], 1], + ["6ljf5", "Basic push operations: OP_PUSHBYTES_16 (P2SH20)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001610000000000000000000000000000000000482608777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914264720413b68ba6ce2cb2f8c7c92ec828a82f3bc87", ["2021_standard", "2022_standard"], 1], + ["hajrl", "Basic push operations: OP_PUSHBYTES_17 (nonP2SH)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000012110000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201118777", ["2021_valid", "2022_valid"], 1], + ["dl6f8", "Basic push operations: OP_PUSHBYTES_17 (P2SH20)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018110000000000000000000000000000000000058201118777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc71efd38361fd302b320bb7fb0fda918033095687", ["2021_standard", "2022_standard"], 1], + ["e6h26", "Basic push operations: OP_PUSHBYTES_18 (nonP2SH)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001312000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201128777", ["2021_valid", "2022_valid"], 1], + ["k39kg", "Basic push operations: OP_PUSHBYTES_18 (P2SH20)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001912000000000000000000000000000000000000058201128777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dca36876dafe5650db8bab999fd2088b937804587", ["2021_standard", "2022_standard"], 1], + ["0g9pf", "Basic push operations: OP_PUSHBYTES_19 (nonP2SH)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000141300000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201138777", ["2021_valid", "2022_valid"], 1], + ["nvau6", "Basic push operations: OP_PUSHBYTES_19 (P2SH20)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1300000000000000000000000000000000000000058201138777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d4b5556e2b7ba6ce35bf5654bea3e9e4b98d269587", ["2021_standard", "2022_standard"], 1], + ["39hlr", "Basic push operations: OP_PUSHBYTES_20 (nonP2SH)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000015140000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201148777", ["2021_valid", "2022_valid"], 1], + ["3e553", "Basic push operations: OP_PUSHBYTES_20 (P2SH20)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b140000000000000000000000000000000000000000058201148777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b98ce584b9ce151836da251897518e90825bbea587", ["2021_standard", "2022_standard"], 1], + ["qmfm4", "Basic push operations: OP_PUSHBYTES_21 (nonP2SH)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001615000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201158777", ["2021_valid", "2022_valid"], 1], + ["u45d9", "Basic push operations: OP_PUSHBYTES_21 (P2SH20)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c15000000000000000000000000000000000000000000058201158777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149c6450943963d8e9a47d8167391186d31f3ff91d87", ["2021_standard", "2022_standard"], 1], + ["vqtm6", "Basic push operations: OP_PUSHBYTES_22 (nonP2SH)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000171600000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201168777", ["2021_valid", "2022_valid"], 1], + ["cx7gd", "Basic push operations: OP_PUSHBYTES_22 (P2SH20)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1600000000000000000000000000000000000000000000058201168777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451edea7c56cb0626bd8d999ba0e6f9cee64f273387", ["2021_standard", "2022_standard"], 1], + ["gw4g0", "Basic push operations: OP_PUSHBYTES_23 (nonP2SH)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018170000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201178777", ["2021_valid", "2022_valid"], 1], + ["f676p", "Basic push operations: OP_PUSHBYTES_23 (P2SH20)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e170000000000000000000000000000000000000000000000058201178777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145d95fee0a25523164be8b007d6e482256358070887", ["2021_standard", "2022_standard"], 1], + ["y67he", "Basic push operations: OP_PUSHBYTES_24 (nonP2SH)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001918000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201188777", ["2021_valid", "2022_valid"], 1], + ["cw9dh", "Basic push operations: OP_PUSHBYTES_24 (P2SH20)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f18000000000000000000000000000000000000000000000000058201188777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91495e25cc3889575b41fdf42f61f34b94a2c7d181d87", ["2021_standard", "2022_standard"], 1], + ["lad28", "Basic push operations: OP_PUSHBYTES_25 (nonP2SH)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1900000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201198777", ["2021_valid", "2022_valid"], 1], + ["jy0ze", "Basic push operations: OP_PUSHBYTES_25 (P2SH20)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201900000000000000000000000000000000000000000000000000058201198777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914221ed86a048b577912b56d6a03474332cb8e8b2087", ["2021_standard", "2022_standard"], 1], + ["xe2g3", "Basic push operations: OP_PUSHBYTES_26 (nonP2SH)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b1a0000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011a8777", ["2021_valid", "2022_valid"], 1], + ["q7ryt", "Basic push operations: OP_PUSHBYTES_26 (P2SH20)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000211a00000000000000000000000000000000000000000000000000000582011a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143337f7e1930e5ca79030cf337703f9566339a91887", ["2021_standard", "2022_standard"], 1], + ["30hyp", "Basic push operations: OP_PUSHBYTES_27 (nonP2SH)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c1b000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011b8777", ["2021_valid", "2022_valid"], 1], + ["w7hj2", "Basic push operations: OP_PUSHBYTES_27 (P2SH20)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000221b0000000000000000000000000000000000000000000000000000000582011b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91487ad0ed1b3849a5741ceac834d6a3d0826972fcb87", ["2021_standard", "2022_standard"], 1], + ["7qefv", "Basic push operations: OP_PUSHBYTES_28 (nonP2SH)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1c00000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011c8777", ["2021_valid", "2022_valid"], 1], + ["6afry", "Basic push operations: OP_PUSHBYTES_28 (P2SH20)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000231c000000000000000000000000000000000000000000000000000000000582011c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c64ef31fb53d0c33398bbc61b3b3d56edf3e596487", ["2021_standard", "2022_standard"], 1], + ["004y8", "Basic push operations: OP_PUSHBYTES_29 (nonP2SH)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1d0000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011d8777", ["2021_valid", "2022_valid"], 1], + ["khjzs", "Basic push operations: OP_PUSHBYTES_29 (P2SH20)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000241d00000000000000000000000000000000000000000000000000000000000582011d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146df2fe5bdd6777f28518e32087bfe8bbc04cf0dc87", ["2021_standard", "2022_standard"], 1], + ["dxnpw", "Basic push operations: OP_PUSHBYTES_30 (nonP2SH)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f1e000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011e8777", ["2021_valid", "2022_valid"], 1], + ["ncfyd", "Basic push operations: OP_PUSHBYTES_30 (P2SH20)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000251e0000000000000000000000000000000000000000000000000000000000000582011e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91408afde6a1b5b1ba056871d80d469c7f441e90efd87", ["2021_standard", "2022_standard"], 1], + ["ydw6y", "Basic push operations: OP_PUSHBYTES_31 (nonP2SH)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201f00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011f8777", ["2021_valid", "2022_valid"], 1], + ["rcm0n", "Basic push operations: OP_PUSHBYTES_31 (P2SH20)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000261f000000000000000000000000000000000000000000000000000000000000000582011f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dad77efc6ca13ba74f97d3513152ead6b56f59a87", ["2021_standard", "2022_standard"], 1], + ["l4k5j", "Basic push operations: OP_PUSHBYTES_32 (nonP2SH)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201208777", ["2021_valid", "2022_valid"], 1], + ["gwa65", "Basic push operations: OP_PUSHBYTES_32 (P2SH20)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027200000000000000000000000000000000000000000000000000000000000000000058201208777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406f3e1df460e90acc01f6b5c02106e91667165bf87", ["2021_standard", "2022_standard"], 1], + ["8arx8", "Basic push operations: OP_PUSHBYTES_33 (nonP2SH)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002221000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201218777", ["2021_valid", "2022_valid"], 1], + ["lf8vg", "Basic push operations: OP_PUSHBYTES_33 (P2SH20)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002821000000000000000000000000000000000000000000000000000000000000000000058201218777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7499543f52b711cb5ef3c0ba36b4c6dc621083487", ["2021_standard", "2022_standard"], 1], + ["8wufw", "Basic push operations: OP_PUSHBYTES_34 (nonP2SH)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000232200000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201228777", ["2021_valid", "2022_valid"], 1], + ["3hycv", "Basic push operations: OP_PUSHBYTES_34 (P2SH20)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292200000000000000000000000000000000000000000000000000000000000000000000058201228777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aeeacc939e76be0859bd4d1203877f11de5535e87", ["2021_standard", "2022_standard"], 1], + ["ep6aw", "Basic push operations: OP_PUSHBYTES_35 (nonP2SH)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000024230000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201238777", ["2021_valid", "2022_valid"], 1], + ["djdke", "Basic push operations: OP_PUSHBYTES_35 (P2SH20)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a230000000000000000000000000000000000000000000000000000000000000000000000058201238777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f868100124fa1ebfd00b040dd73f5bc3cb2a55087", ["2021_standard", "2022_standard"], 1], + ["lcm0g", "Basic push operations: OP_PUSHBYTES_36 (nonP2SH)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002524000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201248777", ["2021_valid", "2022_valid"], 1], + ["p2gl3", "Basic push operations: OP_PUSHBYTES_36 (P2SH20)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b24000000000000000000000000000000000000000000000000000000000000000000000000058201248777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c830e4841b4c717566a6b2f35abad13eb4b223087", ["2021_standard", "2022_standard"], 1], + ["m4c7x", "Basic push operations: OP_PUSHBYTES_37 (nonP2SH)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000262500000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201258777", ["2021_valid", "2022_valid"], 1], + ["d4ncp", "Basic push operations: OP_PUSHBYTES_37 (P2SH20)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2500000000000000000000000000000000000000000000000000000000000000000000000000058201258777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c2b2e1e363ecafb5b3df03f0a7b5d15d51a9965687", ["2021_standard", "2022_standard"], 1], + ["ak572", "Basic push operations: OP_PUSHBYTES_38 (nonP2SH)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027260000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201268777", ["2021_valid", "2022_valid"], 1], + ["mmkjk", "Basic push operations: OP_PUSHBYTES_38 (P2SH20)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d260000000000000000000000000000000000000000000000000000000000000000000000000000058201268777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ce3288a4a81ea394c8bad2ad35271d82f8a115a87", ["2021_standard", "2022_standard"], 1], + ["q2a6l", "Basic push operations: OP_PUSHBYTES_39 (nonP2SH)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002827000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201278777", ["2021_valid", "2022_valid"], 1], + ["ampe2", "Basic push operations: OP_PUSHBYTES_39 (P2SH20)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e27000000000000000000000000000000000000000000000000000000000000000000000000000000058201278777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91466b50d17451438b34f216a14b2f27efc72998f3887", ["2021_standard", "2022_standard"], 1], + ["5s8lk", "Basic push operations: OP_PUSHBYTES_40 (nonP2SH)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201288777", ["2021_valid", "2022_valid"], 1], + ["ahnxk", "Basic push operations: OP_PUSHBYTES_40 (P2SH20)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2800000000000000000000000000000000000000000000000000000000000000000000000000000000058201288777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7ed79eb8b3f886bd65968d05b950dc539c4325587", ["2021_standard", "2022_standard"], 1], + ["qf7mf", "Basic push operations: OP_PUSHBYTES_41 (nonP2SH)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201298777", ["2021_valid", "2022_valid"], 1], + ["2ewj3", "Basic push operations: OP_PUSHBYTES_41 (P2SH20)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000030290000000000000000000000000000000000000000000000000000000000000000000000000000000000058201298777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91426c2d85bb90707c2e985be6f8be682d327bb4a2b87", ["2021_standard", "2022_standard"], 1], + ["dqx0m", "Basic push operations: OP_PUSHBYTES_42 (nonP2SH)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012a8777", ["2021_valid", "2022_valid"], 1], + ["mu75l", "Basic push operations: OP_PUSHBYTES_42 (P2SH20)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000312a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148f9872f9130fe0a1baae088d4a5d47d37ac6a5c687", ["2021_standard", "2022_standard"], 1], + ["2567w", "Basic push operations: OP_PUSHBYTES_43 (nonP2SH)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012b8777", ["2021_valid", "2022_valid"], 1], + ["7pjdc", "Basic push operations: OP_PUSHBYTES_43 (P2SH20)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000322b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7d4cac3da175eebc585e4274bf3a76d3096a37e87", ["2021_standard", "2022_standard"], 1], + ["n8pnz", "Basic push operations: OP_PUSHBYTES_44 (nonP2SH)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012c8777", ["2021_valid", "2022_valid"], 1], + ["jpk5z", "Basic push operations: OP_PUSHBYTES_44 (P2SH20)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000332c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a8a8d7455806683a568f2362182ceec0641b40b987", ["2021_standard", "2022_standard"], 1], + ["guywl", "Basic push operations: OP_PUSHBYTES_45 (nonP2SH)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012d8777", ["2021_valid", "2022_valid"], 1], + ["tgpk4", "Basic push operations: OP_PUSHBYTES_45 (P2SH20)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000342d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91432ea958fd4cc9a322cb80ce5856334c457454ba887", ["2021_standard", "2022_standard"], 1], + ["tmfdw", "Basic push operations: OP_PUSHBYTES_46 (nonP2SH)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012e8777", ["2021_valid", "2022_valid"], 1], + ["8vyze", "Basic push operations: OP_PUSHBYTES_46 (P2SH20)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000352e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914de37f1ef90eb550c3b3d996eb7016a73eed6852f87", ["2021_standard", "2022_standard"], 1], + ["2tlrz", "Basic push operations: OP_PUSHBYTES_47 (nonP2SH)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000302f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012f8777", ["2021_valid", "2022_valid"], 1], + ["cy7a8", "Basic push operations: OP_PUSHBYTES_47 (P2SH20)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000362f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3758cb9ba5090b6b32c2552ee51c04b398eba1c87", ["2021_standard", "2022_standard"], 1], + ["e8rsy", "Basic push operations: OP_PUSHBYTES_48 (nonP2SH)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201308777", ["2021_valid", "2022_valid"], 1], + ["qsc6d", "Basic push operations: OP_PUSHBYTES_48 (P2SH20)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201308777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914155b3d04f9e00ebb9fc1a30e0661cde97c2abd1787", ["2021_standard", "2022_standard"], 1], + ["rw33f", "Basic push operations: OP_PUSHBYTES_49 (nonP2SH)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000323100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201318777", ["2021_valid", "2022_valid"], 1], + ["mqv2w", "Basic push operations: OP_PUSHBYTES_49 (P2SH20)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201318777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428c049cbccaf76ccc3a02b402e91affbd646948c87", ["2021_standard", "2022_standard"], 1], + ["xaena", "Basic push operations: OP_PUSHBYTES_50 (nonP2SH)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000033320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201328777", ["2021_valid", "2022_valid"], 1], + ["hfd6e", "Basic push operations: OP_PUSHBYTES_50 (P2SH20)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201328777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e320b3d5b862f9f6a8de45829cb07a8984e971c87", ["2021_standard", "2022_standard"], 1], + ["e3hnk", "Basic push operations: OP_PUSHBYTES_51 (nonP2SH)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201338777", ["2021_valid", "2022_valid"], 1], + ["9slcu", "Basic push operations: OP_PUSHBYTES_51 (P2SH20)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201338777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d0cb6e4f6a1f7c8095692d22ef3b0cd0295696b087", ["2021_standard", "2022_standard"], 1], + ["fl60y", "Basic push operations: OP_PUSHBYTES_52 (nonP2SH)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000353400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201348777", ["2021_valid", "2022_valid"], 1], + ["r7zmd", "Basic push operations: OP_PUSHBYTES_52 (P2SH20)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201348777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447c59d45ad8efaed1dfd7048511310bbdacb89e887", ["2021_standard", "2022_standard"], 1], + ["9ndk8", "Basic push operations: OP_PUSHBYTES_53 (nonP2SH)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000036350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201358777", ["2021_valid", "2022_valid"], 1], + ["2u4xy", "Basic push operations: OP_PUSHBYTES_53 (P2SH20)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201358777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914710f50b3b6aa9a6f4d972f4782636f2cf77013be87", ["2021_standard", "2022_standard"], 1], + ["6f8pr", "Basic push operations: OP_PUSHBYTES_54 (nonP2SH)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003736000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201368777", ["2021_valid", "2022_valid"], 1], + ["2wqdz", "Basic push operations: OP_PUSHBYTES_54 (P2SH20)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201368777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6448f6bc26a215cf56e0f902f88b7954661f24c87", ["2021_standard", "2022_standard"], 1], + ["ut5wh", "Basic push operations: OP_PUSHBYTES_55 (nonP2SH)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201378777", ["2021_valid", "2022_valid"], 1], + ["c8kcl", "Basic push operations: OP_PUSHBYTES_55 (P2SH20)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201378777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd9e0c67301010cb39ea26e0e77745a764a472be87", ["2021_standard", "2022_standard"], 1], + ["efkpj", "Basic push operations: OP_PUSHBYTES_56 (nonP2SH)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201388777", ["2021_valid", "2022_valid"], 1], + ["fh5t0", "Basic push operations: OP_PUSHBYTES_56 (P2SH20)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201388777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142c05abd339742b3484ddcfefa6467fb69be20e8c87", ["2021_standard", "2022_standard"], 1], + ["xj9r9", "Basic push operations: OP_PUSHBYTES_57 (nonP2SH)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201398777", ["2021_valid", "2022_valid"], 1], + ["d6xk3", "Basic push operations: OP_PUSHBYTES_57 (P2SH20)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201398777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406336beb02d2b38bf56a0924cefb269e9295165987", ["2021_standard", "2022_standard"], 1], + ["lufsz", "Basic push operations: OP_PUSHBYTES_58 (nonP2SH)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013a8777", ["2021_valid", "2022_valid"], 1], + ["88dq6", "Basic push operations: OP_PUSHBYTES_58 (P2SH20)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000413a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b4856711b25d23528c6afacedf0e46d27d5188b387", ["2021_standard", "2022_standard"], 1], + ["w25yd", "Basic push operations: OP_PUSHBYTES_59 (nonP2SH)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013b8777", ["2021_valid", "2022_valid"], 1], + ["zn0ld", "Basic push operations: OP_PUSHBYTES_59 (P2SH20)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000423b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc9deee182ff2c2a9cffe25d8dfe6ce6bf4eabe187", ["2021_standard", "2022_standard"], 1], + ["tupvf", "Basic push operations: OP_PUSHBYTES_60 (nonP2SH)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013c8777", ["2021_valid", "2022_valid"], 1], + ["3fgnc", "Basic push operations: OP_PUSHBYTES_60 (P2SH20)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000433c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cfe57fdc4d23d94a5e72f6e034aba262bd7b864a87", ["2021_standard", "2022_standard"], 1], + ["ykq09", "Basic push operations: OP_PUSHBYTES_61 (nonP2SH)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013d8777", ["2021_valid", "2022_valid"], 1], + ["98ch8", "Basic push operations: OP_PUSHBYTES_61 (P2SH20)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000443d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914134265a6356aead5389df701300d2772933c258587", ["2021_standard", "2022_standard"], 1], + ["62ylk", "Basic push operations: OP_PUSHBYTES_62 (nonP2SH)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013e8777", ["2021_valid", "2022_valid"], 1], + ["0dj2s", "Basic push operations: OP_PUSHBYTES_62 (P2SH20)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000453e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f951edfc4b17e8b0f3bba38b34ff8a559d366f487", ["2021_standard", "2022_standard"], 1], + ["tq0dz", "Basic push operations: OP_PUSHBYTES_63 (nonP2SH)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000403f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013f8777", ["2021_valid", "2022_valid"], 1], + ["klxmx", "Basic push operations: OP_PUSHBYTES_63 (P2SH20)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000463f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436257c34321f3370788a08fbad80f3f7193ed6a187", ["2021_standard", "2022_standard"], 1], + ["t7u5l", "Basic push operations: OP_PUSHBYTES_64 (nonP2SH)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201408777", ["2021_valid", "2022_valid"], 1], + ["7n2w4", "Basic push operations: OP_PUSHBYTES_64 (P2SH20)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201408777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d05e8657f5040bb8216afa5d1857d7e55a16437087", ["2021_standard", "2022_standard"], 1], + ["dv38s", "Basic push operations: OP_PUSHBYTES_65 (nonP2SH)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000042410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201418777", ["2021_valid", "2022_valid"], 1], + ["aht5c", "Basic push operations: OP_PUSHBYTES_65 (P2SH20)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201418777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91448e8cf1dcbe96b9e41ecb1b568e8a6abf01abd1287", ["2021_standard", "2022_standard"], 1], + ["mp674", "Basic push operations: OP_PUSHBYTES_66 (nonP2SH)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201428777", ["2021_valid", "2022_valid"], 1], + ["ht05z", "Basic push operations: OP_PUSHBYTES_66 (P2SH20)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004942000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201428777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91462ccb48c807f2157f2da2b0e3522adfffe5088e687", ["2021_standard", "2022_standard"], 1], + ["lljav", "Basic push operations: OP_PUSHBYTES_67 (nonP2SH)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000444300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201438777", ["2021_valid", "2022_valid"], 1], + ["2mjdl", "Basic push operations: OP_PUSHBYTES_67 (P2SH20)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201438777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d6106281e8b4063cc0814cac1dfa08cd016f218087", ["2021_standard", "2022_standard"], 1], + ["x997y", "Basic push operations: OP_PUSHBYTES_68 (nonP2SH)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000045440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201448777", ["2021_valid", "2022_valid"], 1], + ["ea0kr", "Basic push operations: OP_PUSHBYTES_68 (P2SH20)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201448777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147bb544006af09d45f249194b5f1dc548c8c25cc187", ["2021_standard", "2022_standard"], 1], + ["tuxjz", "Basic push operations: OP_PUSHBYTES_69 (nonP2SH)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201458777", ["2021_valid", "2022_valid"], 1], + ["stqfa", "Basic push operations: OP_PUSHBYTES_69 (P2SH20)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201458777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451e4ee46c9866d974e6cb64265b7b262b3303e3187", ["2021_standard", "2022_standard"], 1], + ["t503j", "Basic push operations: OP_PUSHBYTES_70 (nonP2SH)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201468777", ["2021_valid", "2022_valid"], 1], + ["q87tw", "Basic push operations: OP_PUSHBYTES_70 (P2SH20)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004d4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201468777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b8e67092b458481272f13f5af11d6e599defe09187", ["2021_standard", "2022_standard"], 1], + ["alt06", "Basic push operations: OP_PUSHBYTES_71 (nonP2SH)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201478777", ["2021_valid", "2022_valid"], 1], + ["lw9n4", "Basic push operations: OP_PUSHBYTES_71 (P2SH20)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004e470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201478777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91456c4c25ec3d1076d0aa74736f8ddcfba35fb5cd587", ["2021_standard", "2022_standard"], 1], + ["y56mg", "Basic push operations: OP_PUSHBYTES_72 (nonP2SH)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004948000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201488777", ["2021_valid", "2022_valid"], 1], + ["ytwxz", "Basic push operations: OP_PUSHBYTES_72 (P2SH20)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201488777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91425a0c10cb84352b70f0f607ca1ffd71cc3f6583487", ["2021_standard", "2022_standard"], 1], + ["wfr92", "Basic push operations: OP_PUSHBYTES_73 (nonP2SH)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201498777", ["2021_valid", "2022_valid"], 1], + ["u354v", "Basic push operations: OP_PUSHBYTES_73 (P2SH20)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000504900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201498777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf24577e4ab30bb1b139778f534f20dcca55112d87", ["2021_standard", "2022_standard"], 1], + ["xjn79", "Basic push operations: OP_PUSHBYTES_74 (nonP2SH)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014a8777", ["2021_valid", "2022_valid"], 1], + ["88ghn", "Basic push operations: OP_PUSHBYTES_74 (P2SH20)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000514a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ae9a9d759f2cdae4ee06da823bdc0c1d8e59a49387", ["2021_standard", "2022_standard"], 1], + ["g0lhc", "Basic push operations: OP_PUSHBYTES_75 (nonP2SH)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014b8777", ["2021_valid", "2022_valid"], 1], + ["za4w3", "Basic push operations: OP_PUSHBYTES_75 (P2SH20)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000524b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c637e98bbca207bca3893db7e8ac8fffded1c80a87", ["2021_standard", "2022_standard"], 1], + ["cjtdh", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (nonP2SH)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000101000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825187", ["2021_invalid", "2022_invalid"], 1], + ["urv4v", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (P2SH20)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050103825187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914348babd902f9237b6d28ad1ee00bf6941bc9bddc87", ["2021_invalid", "2022_invalid"], 1], + ["rstq5", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (nonP2SH)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825287", ["2021_invalid", "2022_invalid"], 1], + ["hzs5f", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (P2SH20)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006020003825287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a28702ab5f8e62b7bee8a86d5dba82d797553ff287", ["2021_invalid", "2022_invalid"], 1], + ["3slvl", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (nonP2SH)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825387", ["2021_invalid", "2022_invalid"], 1], + ["9656c", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (P2SH20)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006030003825387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146908ef2fea5347219d7bbde297594d7f88b9ecf787", ["2021_invalid", "2022_invalid"], 1], + ["r76hz", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (nonP2SH)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825487", ["2021_invalid", "2022_invalid"], 1], + ["wnm0h", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (P2SH20)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006040003825487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914741dd8ac897f1921080f1349f0e499133570c7ae87", ["2021_invalid", "2022_invalid"], 1], + ["6eav8", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (nonP2SH)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825587", ["2021_invalid", "2022_invalid"], 1], + ["ludss", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (P2SH20)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050003825587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea47aa431f680ac44ad2630de7928853e5e9014087", ["2021_invalid", "2022_invalid"], 1], + ["lylne", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (nonP2SH)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825687", ["2021_invalid", "2022_invalid"], 1], + ["ywkn9", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (P2SH20)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006060003825687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143c5bd113c470fb925caad11fd469330cb3533cf487", ["2021_invalid", "2022_invalid"], 1], + ["hw0cc", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (nonP2SH)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825787", ["2021_invalid", "2022_invalid"], 1], + ["6jasz", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (P2SH20)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006070003825787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149b2e07b931c3f3f2fa432caf4942dc0439ae183e87", ["2021_invalid", "2022_invalid"], 1], + ["s6kau", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (nonP2SH)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825887", ["2021_invalid", "2022_invalid"], 1], + ["gvnl3", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (P2SH20)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006080003825887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f5401712c7ce3cc2f37cbcd59c2af053459d88eb87", ["2021_invalid", "2022_invalid"], 1], + ["zdmgv", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (nonP2SH)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825987", ["2021_invalid", "2022_invalid"], 1], + ["0xlnr", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (P2SH20)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006090003825987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142fcca85da981948d44ab5b0bb5c2df85df2fded787", ["2021_invalid", "2022_invalid"], 1], + ["rwech", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (nonP2SH)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825a87", ["2021_invalid", "2022_invalid"], 1], + ["sewrg", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (P2SH20)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060a0003825a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413d1522e20ec54a2eb73cf826dec934764816e4387", ["2021_invalid", "2022_invalid"], 1], + ["2v8c9", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (nonP2SH)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825b87", ["2021_invalid", "2022_invalid"], 1], + ["qqfhd", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (P2SH20)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060b0003825b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493f3f936705cdc5a08360e9ce6e0d60f41051fdb87", ["2021_invalid", "2022_invalid"], 1], + ["efukg", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (nonP2SH)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825c87", ["2021_invalid", "2022_invalid"], 1], + ["f720n", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (P2SH20)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060c0003825c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6e50e78a1ffeb9964e151606ea7c3b1dc7c53c087", ["2021_invalid", "2022_invalid"], 1], + ["rwt2g", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (nonP2SH)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825d87", ["2021_invalid", "2022_invalid"], 1], + ["we4vd", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (P2SH20)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060d0003825d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91488e5db69290eaeaad7ecf2c0b879f49efe8706d187", ["2021_invalid", "2022_invalid"], 1], + ["jr9uh", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (nonP2SH)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825e87", ["2021_invalid", "2022_invalid"], 1], + ["77a6m", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (P2SH20)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060e0003825e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7e842cce119144e30c2459752d1953abc66247b87", ["2021_invalid", "2022_invalid"], 1], + ["3wz54", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (nonP2SH)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825f87", ["2021_invalid", "2022_invalid"], 1], + ["auhc8", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (P2SH20)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060f0003825f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914adabaf24212d2e068002b878c591dbcfbda6afb487", ["2021_invalid", "2022_invalid"], 1], + ["sp7ca", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (nonP2SH)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003826087", ["2021_invalid", "2022_invalid"], 1], + ["sthyn", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (P2SH20)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006100003826087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7f943bd2f61decaf4474763cdfe18ae4f178fc187", ["2021_invalid", "2022_invalid"], 1], + ["0zykz", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (nonP2SH)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011187", ["2021_invalid", "2022_invalid"], 1], + ["5z4zh", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (P2SH20)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000711000482011187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fede7df4488fa102dbd016ac8a73b687f1d3f987", ["2021_invalid", "2022_invalid"], 1], + ["k07lm", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (nonP2SH)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011287", ["2021_invalid", "2022_invalid"], 1], + ["zwj6u", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (P2SH20)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000712000482011287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145c75f97e9d4e8860ff31ca63ff47c28510ce212987", ["2021_invalid", "2022_invalid"], 1], + ["6uvj0", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (nonP2SH)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011387", ["2021_invalid", "2022_invalid"], 1], + ["t57la", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (P2SH20)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000713000482011387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3e18c9a3e88665d35b9bb07467088899cdccb6b87", ["2021_invalid", "2022_invalid"], 1], + ["03nhu", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (nonP2SH)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011487", ["2021_invalid", "2022_invalid"], 1], + ["rfd4e", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (P2SH20)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000714000482011487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ef6a89a2dbf92a35a991b641e39d73d923ff564287", ["2021_invalid", "2022_invalid"], 1], + ["nxxh7", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (nonP2SH)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011587", ["2021_invalid", "2022_invalid"], 1], + ["sun00", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (P2SH20)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000715000482011587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140d642007e078cc5bc88b7d72ccfd5938037be61787", ["2021_invalid", "2022_invalid"], 1], + ["f6sw0", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (nonP2SH)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011687", ["2021_invalid", "2022_invalid"], 1], + ["usg5s", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (P2SH20)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000716000482011687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e899033933457a8b58ae3480efba8afd3a754b5587", ["2021_invalid", "2022_invalid"], 1], + ["mhhlj", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (nonP2SH)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011787", ["2021_invalid", "2022_invalid"], 1], + ["shnln", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (P2SH20)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000717000482011787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ce4ea52361a4620b9f4eeb29d82310f382047fa87", ["2021_invalid", "2022_invalid"], 1], + ["jsd8m", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (nonP2SH)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011887", ["2021_invalid", "2022_invalid"], 1], + ["l4958", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (P2SH20)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000718000482011887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91449e7ca1c481e274a893e269da75e9f1d8660b8a187", ["2021_invalid", "2022_invalid"], 1], + ["08tlq", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (nonP2SH)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011987", ["2021_invalid", "2022_invalid"], 1], + ["xs9lz", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (P2SH20)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000719000482011987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914261928ca6985d6fd387f73bebd1f5207d4af3b9a87", ["2021_invalid", "2022_invalid"], 1], + ["xqf3t", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (nonP2SH)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011a87", ["2021_invalid", "2022_invalid"], 1], + ["j9khk", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (P2SH20)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071a000482011a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91435590178ced6b0bd207c26ade7a3cd0f4d104aeb87", ["2021_invalid", "2022_invalid"], 1], + ["0yspc", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (nonP2SH)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011b87", ["2021_invalid", "2022_invalid"], 1], + ["ktaak", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (P2SH20)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071b000482011b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143cb151081f4f762db4b60e42ef7dbce285b3690e87", ["2021_invalid", "2022_invalid"], 1], + ["68faz", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (nonP2SH)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011c87", ["2021_invalid", "2022_invalid"], 1], + ["akgmy", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (P2SH20)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071c000482011c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fbac4fa369bb6b5ee0942cd666f10a0ab0dbe1cb87", ["2021_invalid", "2022_invalid"], 1], + ["3vzsq", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (nonP2SH)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011d87", ["2021_invalid", "2022_invalid"], 1], + ["nj273", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (P2SH20)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071d000482011d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144b497de2489d2cb22d14e22a276440b00e8cbac487", ["2021_invalid", "2022_invalid"], 1], + ["n00p5", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (nonP2SH)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011e87", ["2021_invalid", "2022_invalid"], 1], + ["63ut4", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (P2SH20)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071e000482011e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143b9ccee9e96b7db838fc26158ee6ba585069a24187", ["2021_invalid", "2022_invalid"], 1], + ["3c78h", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (nonP2SH)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011f87", ["2021_invalid", "2022_invalid"], 1], + ["m2c3w", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (P2SH20)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071f000482011f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b45ae13294f970aa8f50c66828539778c80595d87", ["2021_invalid", "2022_invalid"], 1], + ["3lqaf", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (nonP2SH)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012087", ["2021_invalid", "2022_invalid"], 1], + ["57kr0", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (P2SH20)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000720000482012087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c8c6e9f8eed13bf72da94979c5a9c2353f07c4b287", ["2021_invalid", "2022_invalid"], 1], + ["726sl", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (nonP2SH)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012187", ["2021_invalid", "2022_invalid"], 1], + ["cp63m", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (P2SH20)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000721000482012187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145bbe16fe0c60055a980236177c71e53bda38980187", ["2021_invalid", "2022_invalid"], 1], + ["m2pgy", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (nonP2SH)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012287", ["2021_invalid", "2022_invalid"], 1], + ["ytyk0", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (P2SH20)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000722000482012287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f06972a2da955429c9486e9ad231c2ddacd58cdd87", ["2021_invalid", "2022_invalid"], 1], + ["ch34h", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (nonP2SH)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012387", ["2021_invalid", "2022_invalid"], 1], + ["ng6g7", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (P2SH20)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000723000482012387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac251aed5594e5f076286e8279e77f9dd0b2e3fa87", ["2021_invalid", "2022_invalid"], 1], + ["agpjz", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (nonP2SH)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012487", ["2021_invalid", "2022_invalid"], 1], + ["7lt9h", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (P2SH20)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000724000482012487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d7a1bb2ec0506846b456c6760d476c9119eab9eb87", ["2021_invalid", "2022_invalid"], 1], + ["hx5he", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (nonP2SH)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012587", ["2021_invalid", "2022_invalid"], 1], + ["9x5vu", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (P2SH20)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000725000482012587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149672ea177e21140bdf00340f1319c204759bc80d87", ["2021_invalid", "2022_invalid"], 1], + ["hd49m", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (nonP2SH)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012687", ["2021_invalid", "2022_invalid"], 1], + ["463m0", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (P2SH20)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000726000482012687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b97c51aa9846d3a1592a9716c72c59ea4014987b87", ["2021_invalid", "2022_invalid"], 1], + ["vr0ap", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (nonP2SH)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012787", ["2021_invalid", "2022_invalid"], 1], + ["xk5qu", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (P2SH20)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000727000482012787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914838dbf4b707c1c3d7209b35a80038a3e9a4aba3987", ["2021_invalid", "2022_invalid"], 1], + ["c0hkx", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (nonP2SH)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012887", ["2021_invalid", "2022_invalid"], 1], + ["3zfmh", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (P2SH20)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000728000482012887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ce9ab280b9bee5b3ef211315f64f010da4f136bb87", ["2021_invalid", "2022_invalid"], 1], + ["5er5d", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (nonP2SH)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012987", ["2021_invalid", "2022_invalid"], 1], + ["hk4vz", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (P2SH20)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000729000482012987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f7f83137b5abd79af7978c2935fd51d359d9344087", ["2021_invalid", "2022_invalid"], 1], + ["8dnek", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (nonP2SH)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012a87", ["2021_invalid", "2022_invalid"], 1], + ["snlma", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (P2SH20)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072a000482012a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a0d4b834bca78c0f87651005aaf094f6c170ebbb87", ["2021_invalid", "2022_invalid"], 1], + ["yk8ar", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (nonP2SH)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012b87", ["2021_invalid", "2022_invalid"], 1], + ["5l8ag", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (P2SH20)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072b000482012b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d553e97ceedb09c47ddc8c82ea9751a9e672f3ad87", ["2021_invalid", "2022_invalid"], 1], + ["u4m20", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (nonP2SH)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012c87", ["2021_invalid", "2022_invalid"], 1], + ["aadqw", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (P2SH20)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072c000482012c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442d209c70c3252e8592a302b370e389c03603ba787", ["2021_invalid", "2022_invalid"], 1], + ["m5d87", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (nonP2SH)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012d87", ["2021_invalid", "2022_invalid"], 1], + ["2q8yj", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (P2SH20)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072d000482012d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4465c868597e9da5cc428abdaeaf8d99c399fc787", ["2021_invalid", "2022_invalid"], 1], + ["zujyx", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (nonP2SH)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012e87", ["2021_invalid", "2022_invalid"], 1], + ["h7ed9", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (P2SH20)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072e000482012e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2783126d377a9c037f7c7136648757bb69f384087", ["2021_invalid", "2022_invalid"], 1], + ["5k5tw", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (nonP2SH)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012f87", ["2021_invalid", "2022_invalid"], 1], + ["zetm9", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (P2SH20)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072f000482012f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457886f74abe49501fb9f95f1bfbf7c14c16261a387", ["2021_invalid", "2022_invalid"], 1], + ["n542h", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (nonP2SH)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013087", ["2021_invalid", "2022_invalid"], 1], + ["f4rnf", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (P2SH20)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000730000482013087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149e97523dae1574eba4f062a427df6f092328a66b87", ["2021_invalid", "2022_invalid"], 1], + ["ztcwm", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (nonP2SH)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013187", ["2021_invalid", "2022_invalid"], 1], + ["n7rym", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (P2SH20)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000731000482013187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147025024f84e2c86c8c05a156fb243ca26f0e7ddf87", ["2021_invalid", "2022_invalid"], 1], + ["828hc", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (nonP2SH)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013287", ["2021_invalid", "2022_invalid"], 1], + ["l699u", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (P2SH20)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000732000482013287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148c8078e43e6ef3e18f396ec279cccd6d2f5a649b87", ["2021_invalid", "2022_invalid"], 1], + ["7vy7j", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (nonP2SH)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013387", ["2021_invalid", "2022_invalid"], 1], + ["acy6z", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (P2SH20)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000733000482013387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145551ae7ed8b3dd2e51a20fc7b2682e4f54eacbc787", ["2021_invalid", "2022_invalid"], 1], + ["y8ekq", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (nonP2SH)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013487", ["2021_invalid", "2022_invalid"], 1], + ["merlz", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (P2SH20)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000734000482013487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ece2479209ed0af01756bd0b47812853b7f1168387", ["2021_invalid", "2022_invalid"], 1], + ["9xurn", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (nonP2SH)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013587", ["2021_invalid", "2022_invalid"], 1], + ["3snm2", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (P2SH20)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000735000482013587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143ed2c324417d30554e82149f8f022da37092148787", ["2021_invalid", "2022_invalid"], 1], + ["6pjry", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (nonP2SH)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013687", ["2021_invalid", "2022_invalid"], 1], + ["lg2me", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (P2SH20)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000736000482013687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406aa492e4966756df323848855324d1511cc87c187", ["2021_invalid", "2022_invalid"], 1], + ["fnzp8", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (nonP2SH)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013787", ["2021_invalid", "2022_invalid"], 1], + ["v35ax", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (P2SH20)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000737000482013787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acc5c8a4754c20a98bd5489c16d4018d53970bfe87", ["2021_invalid", "2022_invalid"], 1], + ["nstfa", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (nonP2SH)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013887", ["2021_invalid", "2022_invalid"], 1], + ["h0q87", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (P2SH20)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000738000482013887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149806a867af459eae3edeac36e5c5f59681a11f0987", ["2021_invalid", "2022_invalid"], 1], + ["k7k3z", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (nonP2SH)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013987", ["2021_invalid", "2022_invalid"], 1], + ["62s9p", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (P2SH20)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000739000482013987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fa98af27368e371f91fed7fb5234f87719e7b1187", ["2021_invalid", "2022_invalid"], 1], + ["ln6zz", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (nonP2SH)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013a87", ["2021_invalid", "2022_invalid"], 1], + ["4peq4", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (P2SH20)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073a000482013a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142f28b13b3bb4dc030bc0c42485532fd6277b80ab87", ["2021_invalid", "2022_invalid"], 1], + ["48lr4", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (nonP2SH)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013b87", ["2021_invalid", "2022_invalid"], 1], + ["6wemr", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (P2SH20)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073b000482013b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b582383b7c0b8064929c7c696f7ff4e8ddce223087", ["2021_invalid", "2022_invalid"], 1], + ["ucetn", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (nonP2SH)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013c87", ["2021_invalid", "2022_invalid"], 1], + ["7he3a", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (P2SH20)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073c000482013c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149d2262652be5fc894a7a0bafd1b0c6b476f4846887", ["2021_invalid", "2022_invalid"], 1], + ["4suq3", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (nonP2SH)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013d87", ["2021_invalid", "2022_invalid"], 1], + ["zu22a", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (P2SH20)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073d000482013d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914853db769d22bcbf776b88009a04b04a8e4c261ba87", ["2021_invalid", "2022_invalid"], 1], + ["q9prv", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (nonP2SH)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013e87", ["2021_invalid", "2022_invalid"], 1], + ["2ld7h", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (P2SH20)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073e000482013e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142530b28ab0b0f7e276a0dbf4722a9aa532fbad7387", ["2021_invalid", "2022_invalid"], 1], + ["ev7mq", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (nonP2SH)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013f87", ["2021_invalid", "2022_invalid"], 1], + ["jzls3", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (P2SH20)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073f000482013f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146f3c7317731b7a41f05fb504d2e2346f21324ff687", ["2021_invalid", "2022_invalid"], 1], + ["54w6p", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (nonP2SH)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014087", ["2021_invalid", "2022_invalid"], 1], + ["f3egp", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (P2SH20)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000740000482014087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453eade5230e2ba9b605e24693640e4765b9bcf7b87", ["2021_invalid", "2022_invalid"], 1], + ["echpm", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (nonP2SH)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014187", ["2021_invalid", "2022_invalid"], 1], + ["jtanj", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (P2SH20)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000741000482014187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914407ca521c9b3cfdcaf5dd625ab017115b1e8fc0e87", ["2021_invalid", "2022_invalid"], 1], + ["h4aqg", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (nonP2SH)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014287", ["2021_invalid", "2022_invalid"], 1], + ["gtg76", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (P2SH20)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000742000482014287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a6e064b20d85e79ee9cf64b2395e82f4c2be57e687", ["2021_invalid", "2022_invalid"], 1], + ["r776d", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (nonP2SH)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014387", ["2021_invalid", "2022_invalid"], 1], + ["0a7tu", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (P2SH20)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000743000482014387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5325cb585f9efd9556afb055372f9f8fecd3dc687", ["2021_invalid", "2022_invalid"], 1], + ["u763z", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (nonP2SH)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014487", ["2021_invalid", "2022_invalid"], 1], + ["0nv6m", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (P2SH20)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000744000482014487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf8a760b88077e0546b9d7cd072afa779ff98ac987", ["2021_invalid", "2022_invalid"], 1], + ["aduhz", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (nonP2SH)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014587", ["2021_invalid", "2022_invalid"], 1], + ["0azna", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (P2SH20)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000745000482014587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b3ab6b69d924ae006e576b577e0d2d4c994ac5aa87", ["2021_invalid", "2022_invalid"], 1], + ["r36zv", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (nonP2SH)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014687", ["2021_invalid", "2022_invalid"], 1], + ["mhkav", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (P2SH20)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000746000482014687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144bb6e78bebb29d6c041e5a19cbdeb53b5ef04ee287", ["2021_invalid", "2022_invalid"], 1], + ["42w39", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (nonP2SH)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014787", ["2021_invalid", "2022_invalid"], 1], + ["gscmv", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (P2SH20)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000747000482014787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91479f1f5998ddca7c4e2b672afc5a26b2b8b2ffb4187", ["2021_invalid", "2022_invalid"], 1], + ["lcxtm", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (nonP2SH)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014887", ["2021_invalid", "2022_invalid"], 1], + ["glvlg", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (P2SH20)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000748000482014887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e652aaf57b7198f80e3b78401c89cd96c6a6c8bd87", ["2021_invalid", "2022_invalid"], 1], + ["z3t06", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (nonP2SH)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014987", ["2021_invalid", "2022_invalid"], 1], + ["hvje4", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (P2SH20)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000749000482014987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141cef04ad6c1fe8e610323192fe4058df0c91d6c987", ["2021_invalid", "2022_invalid"], 1], + ["zja07", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (nonP2SH)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014a87", ["2021_invalid", "2022_invalid"], 1], + ["r3ycz", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (P2SH20)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074a000482014a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c791c5359a5b6631fd28c4a359221c40af95ec4887", ["2021_invalid", "2022_invalid"], 1], + ["kgq43", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (nonP2SH)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014b87", ["2021_invalid", "2022_invalid"], 1], + ["j4r6x", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (P2SH20)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074b000482014b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac95375c38c1922bea1a42ab755832d3474d9d5a87", ["2021_invalid", "2022_invalid"], 1], + ["zun3v", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (nonP2SH)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000014f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007028100517f7587", ["2021_valid", "2022_valid"], 1], + ["zxc7r", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (P2SH20)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000094f07028100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914edf9bd83cea96dc83ccca7664f1f9a00b29269c287", ["2021_standard", "2022_standard"], 1], + ["4uaxt", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (nonP2SH)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000601007e010087", ["2021_valid", "2022_valid"], 1], + ["9raau", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (P2SH20)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000601007e010087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b0393d69a264db87eb00a790df6746567b3c1aa287", ["2021_standard", "2022_standard"], 1], + ["jrz8s", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (nonP2SH)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020100517f7587", ["2021_valid", "2022_valid"], 1], + ["wyv74", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (P2SH20)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095107020100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bcaf9d3177d81983340ac9fe3f55ebd953c6d79587", ["2021_standard", "2022_standard"], 1], + ["wzn30", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (nonP2SH)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020200517f7587", ["2021_valid", "2022_valid"], 1], + ["wug7g", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (P2SH20)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095207020200517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f112128df80feccbdc473373cc90b7c00588e79987", ["2021_standard", "2022_standard"], 1], + ["ngjnw", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (nonP2SH)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020300517f7587", ["2021_valid", "2022_valid"], 1], + ["srgu3", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (P2SH20)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095307020300517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914210a9c1cacf6ad5cfa8cd23caa29faac266c87c187", ["2021_standard", "2022_standard"], 1], + ["r6nk5", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (nonP2SH)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000154000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020400517f7587", ["2021_valid", "2022_valid"], 1], + ["0x490", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (P2SH20)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095407020400517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914917f322665e34a7b625a1a10bfe7c1027d7598a887", ["2021_standard", "2022_standard"], 1], + ["l0pk8", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (nonP2SH)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000155000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020500517f7587", ["2021_valid", "2022_valid"], 1], + ["p605h", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (P2SH20)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095507020500517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149f8302aba854d2f256ea68bd849bd6cc2d6102e487", ["2021_standard", "2022_standard"], 1], + ["2rg8n", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (nonP2SH)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000156000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020600517f7587", ["2021_valid", "2022_valid"], 1], + ["9vg33", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (P2SH20)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095607020600517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143f30e7eaccdc7723e38ebec71b33a9ed6652c13287", ["2021_standard", "2022_standard"], 1], + ["k5xz6", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (nonP2SH)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000157000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020700517f7587", ["2021_valid", "2022_valid"], 1], + ["jpj9a", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (P2SH20)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095707020700517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf6c32abee6107e74a82482a993565559f952bc587", ["2021_standard", "2022_standard"], 1], + ["qgjft", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (nonP2SH)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000158000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020800517f7587", ["2021_valid", "2022_valid"], 1], + ["eypxh", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (P2SH20)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095807020800517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91458afc4c0eff327badf41f3cea636b81b5ebe226a87", ["2021_standard", "2022_standard"], 1], + ["327xw", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (nonP2SH)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000159000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020900517f7587", ["2021_valid", "2022_valid"], 1], + ["4hw4j", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (P2SH20)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095907020900517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91476364e9f7c4177c7d59b4889859dcdf62394290087", ["2021_standard", "2022_standard"], 1], + ["ek4x8", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (nonP2SH)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020a00517f7587", ["2021_valid", "2022_valid"], 1], + ["jp0nc", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (P2SH20)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095a07020a00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c9d469c68d6d1c5ee99a84da776a4342720e14de87", ["2021_standard", "2022_standard"], 1], + ["rrkvk", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (nonP2SH)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015b000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020b00517f7587", ["2021_valid", "2022_valid"], 1], + ["g4m06", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (P2SH20)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095b07020b00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140f28d0feca9fffd5da3341b8aeec84ada153ad4187", ["2021_standard", "2022_standard"], 1], + ["fcwkn", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (nonP2SH)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015c000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020c00517f7587", ["2021_valid", "2022_valid"], 1], + ["lfctt", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (P2SH20)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095c07020c00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c1441ecc5fa477fff34ede789e1e52db2d2ba9de87", ["2021_standard", "2022_standard"], 1], + ["r55a5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (nonP2SH)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015d000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020d00517f7587", ["2021_valid", "2022_valid"], 1], + ["98jc5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (P2SH20)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095d07020d00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd73db0b64abdde5f111cc3317fb79d69693830f87", ["2021_standard", "2022_standard"], 1], + ["plw4j", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (nonP2SH)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015e000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020e00517f7587", ["2021_valid", "2022_valid"], 1], + ["tn0yk", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (P2SH20)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095e07020e00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a497900e13167138578d4ad7c1c964a3d97eba487", ["2021_standard", "2022_standard"], 1], + ["xwch4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (nonP2SH)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020f00517f7587", ["2021_valid", "2022_valid"], 1], + ["jk2j4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (P2SH20)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095f07020f00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b583fb4fbaeadd44472ed6038d58d54382fcde4887", ["2021_standard", "2022_standard"], 1], + ["4wkp7", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (nonP2SH)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000160000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007021000517f7587", ["2021_valid", "2022_valid"], 1], + ["pq524", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (P2SH20)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000096007021000517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145f81e01b1fb63631266af881f8812e430f73005187", ["2021_standard", "2022_standard"], 1], + ["j4u37", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000400635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", ["2021_valid", "2022_valid"], 1], + ["sywcn", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006006350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", ["2021_valid", "2022_valid"], 1], + ["x8uj0", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000451635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", ["2021_invalid", "2022_invalid"], 1], + ["7jru3", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006516350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", ["2021_invalid", "2022_invalid"], 1], + ["3p8ht", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (nonP2SH)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000161000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", ["2021_valid", "2022_valid"], 1], + ["2nth6", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (P2SH20)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003610151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", ["2021_valid", "2022_valid"], 1], + ["j9jae", "Disabled/failing operations: OP_RESERVED is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", ["2021_valid", "2022_valid"], 1], + ["0xf4x", "Disabled/failing operations: OP_RESERVED is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", ["2021_standard", "2022_standard"], 1], + ["txj23", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", ["2021_invalid", "2022_invalid"], 1], + ["y5xzt", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", ["2021_invalid", "2022_invalid"], 1], + ["4as4l", "Disabled/failing operations: OP_VER is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", ["2021_valid", "2022_valid"], 1], + ["al0jz", "Disabled/failing operations: OP_VER is standard if not executed (P2SH20)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", ["2021_standard", "2022_standard"], 1], + ["cd60d", "Disabled/failing operations: OP_VER fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", ["2021_invalid", "2022_invalid"], 1], + ["p4v07", "Disabled/failing operations: OP_VER fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", ["2021_invalid", "2022_invalid"], 1], + ["dk9kf", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463656851", ["2021_invalid", "2022_invalid"], 1], + ["n0ye4", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463656851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457dc1a70809660410571bdb537e003fec3428bc487", ["2021_invalid", "2022_invalid"], 1], + ["j865d", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463666851", ["2021_invalid", "2022_invalid"], 1], + ["pcrac", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463666851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914403de1b3ab6d2cfa5fb35620f088769beb080f0287", ["2021_invalid", "2022_invalid"], 1], + ["4h0af", "Disabled/failing operations: OP_RETURN is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", ["2021_valid", "2022_valid"], 1], + ["dx6xk", "Disabled/failing operations: OP_RETURN is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", ["2021_standard", "2022_standard"], 1], + ["f8605", "Disabled/failing operations: OP_RETURN fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", ["2021_invalid", "2022_invalid"], 1], + ["j8gj8", "Disabled/failing operations: OP_RETURN fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", ["2021_invalid", "2022_invalid"], 1], + ["z5zyz", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463836851", ["2021_invalid", "2022_invalid"], 1], + ["5xw0n", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463836851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149a24bd2a162d0f4df5fe7fef6d66fccacd0e5f9887", ["2021_invalid", "2022_invalid"], 1], + ["3xwla", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", ["2021_valid", "2022_valid"], 1], + ["7cm87", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", ["2021_standard", "2022_standard"], 1], + ["9m6kt", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", ["2021_invalid", "2022_invalid"], 1], + ["z3rkc", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", ["2021_invalid", "2022_invalid"], 1], + ["36ylw", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", ["2021_valid", "2022_valid"], 1], + ["0c9yx", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", ["2021_standard", "2022_standard"], 1], + ["a7c26", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", ["2021_invalid", "2022_invalid"], 1], + ["u5wae", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", ["2021_invalid", "2022_invalid"], 1], + ["alwy0", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638d6851", ["2021_invalid", "2022_invalid"], 1], + ["s49g9", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638d6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141aa1b8bcc573b4fe778d7912487101446b016e9187", ["2021_invalid", "2022_invalid"], 1], + ["g3qe3", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638e6851", ["2021_invalid", "2022_invalid"], 1], + ["jnfe2", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638e6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142acbb440e71f59b71efdfc6d81954b7dc7130c7587", ["2021_invalid", "2022_invalid"], 1], + ["2q4a4", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463986851", ["2021_invalid", "2022_invalid"], 1], + ["49r5l", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463986851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a2ec10dbc7a3ba53b6836c48756ad98a50543ff87", ["2021_invalid", "2022_invalid"], 1], + ["9t87w", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463996851", ["2021_invalid", "2022_invalid"], 1], + ["su3pf", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463996851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145cf960dc2e4d0da4a3642b8ac200d39faca2675587", ["2021_invalid", "2022_invalid"], 1], + ["lz2vp", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (nonP2SH)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b0", ["2021_valid", "2022_valid"], 1], + ["e9r4g", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (P2SH20)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b0000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914198821d0c372b25f4d25d71171164ac5a3a0f20d87", ["2021_valid", "2022_valid"], 1], + ["u9jep", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (nonP2SH)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b3", ["2021_valid", "2022_valid"], 1], + ["7ajt0", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (P2SH20)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b3000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914eb9fdedf708d6110ac11e3c10f5bf0e3c59a666d87", ["2021_valid", "2022_valid"], 1], + ["73c2h", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (nonP2SH)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b4", ["2021_valid", "2022_valid"], 1], + ["rkm3y", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (P2SH20)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b4000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a63f6475f705155c509056cc131bd9dcbce228ef87", ["2021_valid", "2022_valid"], 1], + ["hh7du", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (nonP2SH)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b5", ["2021_valid", "2022_valid"], 1], + ["ay989", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (P2SH20)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b5000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914703b3c7dd955ecad9d283f9ee6baddb33b11795d87", ["2021_valid", "2022_valid"], 1], + ["k87ru", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (nonP2SH)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b6", ["2021_valid", "2022_valid"], 1], + ["gk9md", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (P2SH20)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b6000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf12535fc1a7c0040b019a516904cbe2737785f387", ["2021_valid", "2022_valid"], 1], + ["9rwt7", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (nonP2SH)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b7", ["2021_valid", "2022_valid"], 1], + ["wxp8r", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (P2SH20)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b7000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146fd2ec5df0f6a6534d1cb0be74c3a1a9323681a087", ["2021_valid", "2022_valid"], 1], + ["ak0rz", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (nonP2SH)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b8", ["2021_valid", "2022_valid"], 1], + ["hqheq", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (P2SH20)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b8000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e8ca1d58727effeb462d1d2dd1b17bdc89c133d87", ["2021_valid", "2022_valid"], 1], + ["7a748", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (nonP2SH)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b9", ["2021_valid", "2022_valid"], 1], + ["gyuak", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (P2SH20)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b9000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91415727299b05b45fdaf9ac9ecf7565cfe27c3e56787", ["2021_valid", "2022_valid"], 1], + ["tqlk6", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c068c0c087", ["2021_invalid", "2022_valid"], 1], + ["alcrs", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c068c0c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea3868cab03ec45c9868fe7d658511c73d12243c87", ["2021_invalid", "2022_standard"], 1], + ["seaka", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c168c1c187", ["2021_invalid", "2022_valid"], 1], + ["2assf", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c168c1c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914477b47786ea1fb2e90f5cc2c4acdd3e376815a7287", ["2021_invalid", "2022_standard"], 1], + ["apa8e", "Conditionally executed operations: OP_TXVERSION is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c268c2c287", ["2021_invalid", "2022_valid"], 1], + ["lguf9", "Conditionally executed operations: OP_TXVERSION is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c268c2c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91420f70f0d60b4457ccd9efe9990dd5f18c67e5feb87", ["2021_invalid", "2022_standard"], 1], + ["mzu8u", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c368c3c387", ["2021_invalid", "2022_valid"], 1], + ["n2ylt", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c368c3c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914850d090785681c32fd42795b106efe894555c08987", ["2021_invalid", "2022_standard"], 1], + ["zw3pl", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c468c4c487", ["2021_invalid", "2022_valid"], 1], + ["6twdw", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c468c4c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fb505dfa0eb3e2ca0325a9d5a0f36a4077eeb787", ["2021_invalid", "2022_standard"], 1], + ["gsqxz", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c568c5c587", ["2021_invalid", "2022_valid"], 1], + ["mrpue", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c568c5c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143bc61a327cb0a99af66276434112bdec93b13c3e87", ["2021_invalid", "2022_standard"], 1], + ["ldy8s", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c66800c600c687", ["2021_invalid", "2022_valid"], 1], + ["6my5d", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c66800c600c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c7f6c545c7fbe0e521a99fd2414f1d616f0a01687", ["2021_invalid", "2022_standard"], 1], + ["3hy92", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c76800c700c787", ["2021_invalid", "2022_valid"], 1], + ["5z4k5", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c76800c700c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144879033da25aedede3be2bacbe1b7da877fd042f87", ["2021_invalid", "2022_standard"], 1], + ["e78pl", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c86800c800c887", ["2021_invalid", "2022_valid"], 1], + ["f7mt8", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c86800c800c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91409fc037b8160b2add4528781119d28c259a4ed6287", ["2021_invalid", "2022_standard"], 1], + ["x2wdc", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c96800c900c987", ["2021_invalid", "2022_valid"], 1], + ["ajmc2", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c96800c900c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144997d5f6154f4247d270c1ca6bd10c1d0b6905d687", ["2021_invalid", "2022_standard"], 1], + ["uduf8", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300ca6800ca00ca87", ["2021_invalid", "2022_valid"], 1], + ["pzg7m", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300ca6800ca00ca87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e70d53d53ebbe279c00c6e9f5cf6451872604d687", ["2021_invalid", "2022_standard"], 1], + ["qxn8m", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cb6800cb00cb87", ["2021_invalid", "2022_valid"], 1], + ["2cakt", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cb6800cb00cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7d9d372f7d53761530cc6d60a923fdc2b4fd50f87", ["2021_invalid", "2022_standard"], 1], + ["urj42", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cc6800cc00cc87", ["2021_invalid", "2022_valid"], 1], + ["5drus", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cc6800cc00cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d36b18a86a63c10fbd478761af3bd396fd2f533b87", ["2021_invalid", "2022_standard"], 1], + ["3emly", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cd6800cd00cd87", ["2021_invalid", "2022_valid"], 1], + ["302t6", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cd6800cd00cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142ed955210967b8a4404cc0d583e7babefb7f27c987", ["2021_invalid", "2022_standard"], 1], + ["8gajz", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (nonP2SH)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c0c08b879169", ["2021_invalid", "2022_valid"], 1], + ["6qrjv", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (P2SH20)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c0c08b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b11c6e0c2629f1cbe853a37b7334e610d00735d187", ["2021_invalid", "2022_standard"], 1], + ["330v3", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c1c1bc879169", ["2021_invalid", "2022_valid"], 1], + ["r3wdg", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (P2SH20)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c1c1bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e2ba2745f5921de3adac41be6516ada6556358587", ["2021_invalid", "2022_standard"], 1], + ["sl8fe", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (nonP2SH)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c2c28b879169", ["2021_invalid", "2022_valid"], 1], + ["qedqk", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (P2SH20)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c2c28b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914db5fe9c95e4b14f8cfab965daec5db61ead4eaf687", ["2021_invalid", "2022_standard"], 1], + ["k06h0", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c3c38b879169", ["2021_invalid", "2022_valid"], 1], + ["8rlh9", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c3c38b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147417cae3f1e6718721b357981081a3184e33c91a87", ["2021_invalid", "2022_standard"], 1], + ["va8j0", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c4c48b879169", ["2021_invalid", "2022_valid"], 1], + ["58kul", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c4c48b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b53f666cf707f35b113edb8faa6dd0213d1ad1f87", ["2021_invalid", "2022_standard"], 1], + ["xe5xs", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c5c58b879169", ["2021_invalid", "2022_valid"], 1], + ["af9ne", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (P2SH20)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c5c58b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91490c1cd4cf4cf0f1c972ea094ea3d994921e7083587", ["2021_invalid", "2022_standard"], 1], + ["scmsx", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c651c68b879169", ["2021_invalid", "2022_valid"], 1], + ["et934", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c651c68b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914955b780dcde5d4b3d7aed566fba07e0bb3c5065c87", ["2021_invalid", "2022_standard"], 1], + ["u4e5e", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c751c7bc879169", ["2021_invalid", "2022_valid"], 1], + ["7ey96", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c751c7bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da445b913e3447b117a5452848695ce65c61d76987", ["2021_invalid", "2022_standard"], 1], + ["t5m2t", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000002951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169", ["2021_invalid", "2022_valid"], 1], + ["k5w7d", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b512951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91416800cbe8ddc320a441e2e11c0ba98741682dad087", ["2021_invalid", "2022_standard"], 1], + ["z8rgw", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c951c98b879169", ["2021_invalid", "2022_valid"], 1], + ["r056j", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c951c98b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cce2a3bf93e117c6787d1283a3d32386b6df2c8b87", ["2021_invalid", "2022_standard"], 1], + ["y68ar", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800ca00cabc879169", ["2021_invalid", "2022_valid"], 1], + ["7smqv", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800ca00cabc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91414637fba5aac0495da5b4a1249be1c950e27f4bc87", ["2021_invalid", "2022_standard"], 1], + ["jg8pe", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851cb51cb8b879169", ["2021_invalid", "2022_valid"], 1], + ["d8jsx", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851cb51cb8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91463c1f043dedba365b3d1f9b75c233a0ba01d90a787", ["2021_invalid", "2022_standard"], 1], + ["entgm", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cc00cc8b879169", ["2021_invalid", "2022_valid"], 1], + ["56e9w", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cc00cc8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91485e3a291f9d3bca9fef2670c0aff48285233a58787", ["2021_invalid", "2022_standard"], 1], + ["0vzkx", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cd00cdbc879169", ["2021_invalid", "2022_valid"], 1], + ["50yzt", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cd00cdbc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493b1221c4c54b8c14c4d57e7ba66b8025c29bcc587", ["2021_invalid", "2022_standard"], 1], + ["ex3vn", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000002c08710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac", ["2021_invalid", "2022_valid"]], + ["rgp33", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000040002c0870000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b438710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac", ["2021_invalid", "2022_standard"]], + ["6lwsk", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", ["2021_invalid", "2022_invalid"], 1], + ["q5jpu", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", ["2021_invalid", "2022_invalid"], 1], + ["njett", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", ["2021_invalid", "2022_valid"], 1], + ["j3pwv", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (P2SH20)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", ["2021_invalid", "2022_standard"], 1], + ["sedjh", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (nonP2SH)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000152000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", ["2021_invalid", "2022_valid"], 2], + ["7fzh2", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (P2SH20)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045202c087000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", ["2021_invalid", "2022_standard"], 2], + ["zvwad", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (nonP2SH)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000090000000159000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", ["2021_invalid", "2022_valid"], 9], + ["k28an", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (P2SH20)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045902c087000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", ["2021_invalid", "2022_standard"], 9], + ["uc6pt", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c187", ["2021_invalid", "2022_valid"], 1], + ["zttc4", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (P2SH20)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000602c18702c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b1182c31f4b3659924bc83505a2fb37667fda12387", ["2021_invalid", "2022_standard"], 1], + ["lv70c", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005825588c187", ["2021_invalid", "2022_valid"], 1], + ["039hr", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c05825588c18705825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148dbc087995eb473353236a1c0897a69aab5c48ce87", ["2021_invalid", "2022_standard"], 1], + ["rtmne", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000876825888c188c187", ["2021_invalid", "2022_valid"], 1], + ["4zlny", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120876825888c188c1870876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148640cbdd1c115e08f75d9082e58c4de400d1652887", ["2021_invalid", "2022_standard"], 1], + ["hskmq", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825288abc187", ["2021_invalid", "2022_valid"], 1], + ["j4509", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a02c18706825288abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148734854d785e3d6851ef94a0f362b94d4966540887", ["2021_invalid", "2022_standard"], 1], + ["f6px7", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040388c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000068253ab88c187", ["2021_invalid", "2022_valid"], 1], + ["fwehg", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0388c187068253ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475155507ce3aa062c54092f875a4ddc17e5980dc87", ["2021_invalid", "2022_standard"], 1], + ["9vqdu", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825388abc187", ["2021_invalid", "2022_invalid"], 1], + ["5myl3", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03abc18706825388abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91455a363671564191ddf82d56bcebb6ed469eb382087", ["2021_invalid", "2022_invalid"], 1], + ["y2w24", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403c1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000088253ab88abc1ab87", ["2021_invalid", "2022_valid"], 1], + ["slkdz", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d03c1ab87088253ab88abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914468383d12181a33b9eb17b48a3b4f7792c17bd7487", ["2021_invalid", "2022_standard"], 1], + ["mfzua", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (nonP2SH)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03c1ab8706c188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000b8256ab88abc188abc1ab87", ["2021_invalid", "2022_valid"], 1], + ["wjg6k", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (P2SH20)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001703c1ab8706c188abc1ab870b8256ab88abc188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914767d9af37e4c295a64c4c6551c275c9c4313d90587", ["2021_invalid", "2022_standard"], 1], + ["5xege", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (nonP2SH)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000bc188abc188abc1ab88c187", ["2021_invalid", "2022_valid"], 1], + ["ufg8x", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (P2SH20)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91481397bc5b66a96ab5aa8e23636ed478dee9a845687", ["2021_invalid", "2022_standard"], 1], + ["346js", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004c0c7c188", ["2021_invalid", "2022_valid"], 1], + ["nha5r", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (P2SH20)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104c0c7c188000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d13ea3d424daf33bc3d66e0987dd034ec1f96b5f87", ["2021_invalid", "2022_invalid"], 1], + ["0z8mh", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302a914000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000009c1a901877e7ec0c787", ["2021_invalid", "2022_invalid"], 1], + ["nxpe4", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (P2SH20)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d02a91409c1a901877e7ec0c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140e00addcc1b4ce2fb55d4de0189f0776842ce60a87", ["2021_invalid", "2022_standard"], 1], + ["5kcwm", "Transaction inspection: OP_TXVERSION (version == 0) (nonP2SH)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["76sru", "Transaction inspection: OP_TXVERSION (version == 0) (P2SH20)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_valid"], 1], + ["22j8j", "Transaction inspection: OP_TXVERSION (version == 1) (nonP2SH)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["gvdq0", "Transaction inspection: OP_TXVERSION (version == 1) (P2SH20)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_standard"], 1], + ["4s00e", "Transaction inspection: OP_TXVERSION (version == 2) (nonP2SH)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["w4xtx", "Transaction inspection: OP_TXVERSION (version == 2) (P2SH20)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_standard"], 1], + ["j8uzj", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_invalid"], 1], + ["sdqs6", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_invalid"], 1], + ["274ra", "Transaction inspection: OP_TXVERSION (version == 3) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["mxsfm", "Transaction inspection: OP_TXVERSION (version == 3) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_valid"], 1], + ["a7ywg", "Transaction inspection: OP_TXVERSION (version == 123456) (nonP2SH)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040340e201000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["fp07h", "Transaction inspection: OP_TXVERSION (version == 123456) (P2SH20)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070340e20102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_valid"], 1], + ["hfwul", "Transaction inspection: OP_TXVERSION (version == 4294967294) (nonP2SH)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["csz4l", "Transaction inspection: OP_TXVERSION (version == 4294967294) (P2SH20)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_valid"], 1], + ["dyax6", "Transaction inspection: OP_TXVERSION (version == 4294967295) (nonP2SH)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", ["2021_invalid", "2022_valid"], 1], + ["prrm7", "Transaction inspection: OP_TXVERSION (version == 4294967295) (P2SH20)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", ["2021_invalid", "2022_valid"], 1], + ["akydk", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (nonP2SH)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", ["2021_invalid", "2022_valid"], 1], + ["tgdk8", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (P2SH20)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", ["2021_invalid", "2022_standard"], 1], + ["lnw7q", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", ["2021_invalid", "2022_invalid"], 1], + ["prjxm", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", ["2021_invalid", "2022_invalid"], 1], + ["fwh5z", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (nonP2SH)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003951373130302d627974652074782073697a65206d696e696d756d20313233343536373839303132333435363738393031323334353637383930000000000100000000000000000a6a08766d625f7465737400000000", "0110270000000000000375c387", ["2021_invalid", "2022_valid"]], + ["yava7", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (P2SH20)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003d51373130302d627974652074782073697a65206d696e696d756d203132333435363738393031323334353637383930313233343536373839300375c387000000000100000000000000000a6a08766d625f7465737400000000", "01102700000000000017a914410488baf72ce08518ed6da0fda16f91b1907f8487", ["2021_invalid", "2022_standard"]], + ["49y82", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (nonP2SH)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000153000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", ["2021_invalid", "2022_valid"], 2], + ["2exhq", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (P2SH20)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045302c387000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", ["2021_invalid", "2022_standard"], 2], + ["hxyj3", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (nonP2SH)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", ["2021_invalid", "2022_valid"], 9], + ["tzw7t", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (P2SH20)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045a02c387000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", ["2021_invalid", "2022_standard"], 9], + [ + "dr4g8", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (nonP2SH)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "02000000650000000000000000000000000000000000000000000000000000000000000000000000000201650000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", + ["2021_invalid", "2022_valid"] + ], + [ + "gk0x7", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (P2SH20)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "020000006500000000000000000000000000000000000000000000000000000000000000000000000005016502c3870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", + ["2021_invalid", "2022_standard"] + ], + ["9vegm", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", ["2021_invalid", "2022_valid"], 1], + ["ajcr7", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", ["2021_invalid", "2022_standard"], 1], + ["pysvy", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (nonP2SH)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", ["2021_invalid", "2022_valid"], 1], + ["2hcnx", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (P2SH20)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c487000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", ["2021_invalid", "2022_standard"], 1], + ["a6s0u", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (nonP2SH)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", ["2021_invalid", "2022_valid"], 1], + ["qmaks", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (P2SH20)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c487000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", ["2021_invalid", "2022_standard"], 1], + ["5953j", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (nonP2SH)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020114000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", ["2021_invalid", "2022_valid"], 1], + ["v380g", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (P2SH20)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005011402c487000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", ["2021_invalid", "2022_standard"], 1], + ["al69w", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (nonP2SH)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020164000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", ["2021_invalid", "2022_valid"], 1], + ["jyvyq", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (P2SH20)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005016402c487000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", ["2021_invalid", "2022_valid"], 1], + ["dekhm", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (nonP2SH)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["wg5ru", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (P2SH20)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["949mh", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_invalid"], 1], + ["usfq9", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_invalid"], 1], + ["p3fed", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["hskrl", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["60fqf", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (nonP2SH)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["xhmrq", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (P2SH20)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c587000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["2cjpp", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (nonP2SH)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000504ff64cd1d000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["thcne", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (P2SH20)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000804ff64cd1d02c587000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["62v09", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (nonP2SH)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005040065cd1d000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["nantk", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (P2SH20)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008040065cd1d02c587000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["c59cv", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (nonP2SH)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["msua4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (P2SH20)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c587000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["wt8a4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (nonP2SH)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", ["2021_invalid", "2022_valid"], 1], + ["snd48", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (P2SH20)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c587000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", ["2021_invalid", "2022_standard"], 1], + ["apasg", "Transaction inspection: OP_UTXOVALUE (10000) (nonP2SH)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", ["2021_invalid", "2022_valid"], 1], + ["34j34", "Transaction inspection: OP_UTXOVALUE (10000) (P2SH20)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_standard"], 1], + ["z4ygy", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (nonP2SH)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402112700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", ["2021_invalid", "2022_invalid"], 1], + ["lgyyx", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (P2SH20)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070211270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_invalid"], 1], + ["y63fa", "Transaction inspection: OP_UTXOVALUE (ignore result) (nonP2SH)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c675", ["2021_invalid", "2022_valid"], 1], + ["6w9l3", "Transaction inspection: OP_UTXOVALUE (ignore result) (P2SH20)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436e9c1e392c4a754ccf9e2521e46d63af0b5bb2587", ["2021_invalid", "2022_standard"], 1], + ["j5h3j", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (nonP2SH)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c675", ["2021_invalid", "2022_valid"], 1], + ["5gx2e", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (P2SH20)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ac9e62b390b0ca55959ba30d121a50fc62472b187", ["2021_invalid", "2022_standard"], 1], + ["hxtst", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (nonP2SH)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc675", ["2021_invalid", "2022_invalid"], 1], + ["05pdg", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (P2SH20)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91418edf008814b787b1ad6ce2609acf3cde52c7c1e87", ["2021_invalid", "2022_invalid"], 1], + ["hvapj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c675", ["2021_invalid", "2022_invalid"], 1], + ["t26yj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914420bf68700082813d30ab118efb905bfd182456d87", ["2021_invalid", "2022_invalid"], 1], + ["3wlp4", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (nonP2SH)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c675", ["2021_invalid", "2022_invalid"], 1], + ["5gaqe", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (P2SH20)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143a4c2f5e4735fc878b1bbd5b5954f514d5c8be8887", ["2021_invalid", "2022_invalid"], 1], + ["dlaxg", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (nonP2SH)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102751000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", ["2021_invalid", "2022_valid"], 1], + ["ucme6", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (P2SH20)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210275102c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_standard"], 1], + [ + "yedea", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (nonP2SH)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000060340e20101640000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c68740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", + ["2021_invalid", "2022_valid"] + ], + [ + "lpa37", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (P2SH20)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000090340e201016402c6870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a914d497ca2f5c238fc820a85a9230c26815ebb851918740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", + ["2021_invalid", "2022_standard"] + ], + ["wspfd", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000060415cd5b070000000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000002c687", ["2021_invalid", "2022_valid"]], + ["nu68c", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000090415cd5b070002c68700000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_standard"]], + ["e2mjt", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "020000000100000000000000000000000000000000000000000000000000000000000000000000000009070040075af0750700000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070002c687", ["2021_invalid", "2022_valid"]], + ["lnseh", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000c070040075af075070002c687000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_standard"]], + ["uh9nd", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000a08ffffffffffffff7f00000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f02c687", ["2021_invalid", "2022_valid"]], + ["7gyvw", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000d08ffffffffffffff7f0002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f17a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_standard"]], + ["9crn2", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000b0900000000000000800000000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008002c687", ["2021_invalid", "2022_invalid"]], + ["j7l4x", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000e090000000000000080000002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", ["2021_invalid", "2022_invalid"]], + ["j33pn", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (nonP2SH)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", ["2021_invalid", "2022_valid"], 1], + ["ezfrr", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (P2SH20)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080351c7870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", ["2021_invalid", "2022_invalid"], 1], + ["e5r7z", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (nonP2SH)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001817a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", ["2021_invalid", "2022_invalid"], 1], + ["jqj53", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (P2SH20)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c17a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", ["2021_invalid", "2022_standard"], 1], + ["fgxup", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (nonP2SH)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c787", ["2021_invalid", "2022_valid"], 1], + ["2uchy", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (P2SH20)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac0300c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148756772161ff4b37f5047eb8fec993a67bb25cbf87", ["2021_invalid", "2022_standard"], 1], + ["7wqmv", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c775", ["2021_invalid", "2022_valid"], 1], + ["6ml7d", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ad47e0f844f6bbc33df425e13d639da1be47320487", ["2021_invalid", "2022_standard"], 1], + ["08c02", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c775", ["2021_invalid", "2022_valid"], 1], + ["r6tsz", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a92cca806d7cd3f2219d30b8827879c35483cc1387", ["2021_invalid", "2022_standard"], 1], + ["h5zg4", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc775", ["2021_invalid", "2022_invalid"], 1], + ["ud8dm", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c48a1a82842311c3d918d603c81e2d78f8c838f287", ["2021_invalid", "2022_invalid"], 1], + ["s99rk", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c775", ["2021_invalid", "2022_invalid"], 1], + ["hu2xq", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ca62f6db097fa158803514b761256aade895efc87", ["2021_invalid", "2022_invalid"], 1], + ["n6fk2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c775", ["2021_invalid", "2022_invalid"], 1], + ["580u2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a42e9d731b888b654730a3f2ad520559cd1063b487", ["2021_invalid", "2022_invalid"], 1], + ["aq6sp", "Transaction inspection: OP_UTXOBYTECODE (maximum size UTXO bytecode) (nonP2SH)", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787", ["2021_invalid", "2022_valid"], 1], + ["ezh0a", "Transaction inspection: OP_UTXOBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c775", ["2021_invalid", "2022_valid"], 1], + ["wh04c", "Transaction inspection: OP_UTXOBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd09024d0202000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00017551c775", ["2021_invalid", "2022_invalid"], 1], + ["790ux", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (nonP2SH)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000380402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001900c78851abc78852c78853c7ab8857c7885dc788ab012ac78710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187", ["2021_invalid", "2022_valid"]], + ["njcfy", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (P2SH20)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000520402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a4f3c4e1e03734f5e4f73f136152b28f2957cbc18710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187", ["2021_invalid", "2022_invalid"]], + ["t5nr8", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (nonP2SH)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000006017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000000f00c788ab51c788ab52c788ab53c787102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987", ["2021_invalid", "2022_invalid"]], + ["926rx", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (P2SH20)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000007017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870f00c788ab51c788ab52c788ab53c7870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a9143c791e34d5366304e5474eb19abb41541331423187102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987", ["2021_invalid", "2022_standard"]], + ["4vuv4", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c887", ["2021_invalid", "2022_valid"], 1], + ["rgrps", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000300c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442357ab9beeb0809abf286d2ecbbd047709f4ff887", ["2021_invalid", "2022_standard"], 1], + ["nnh8r", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", ["2021_invalid", "2022_valid"], 1], + ["p9ukh", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", ["2021_invalid", "2022_standard"], 1], + ["8hky8", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000001000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", ["2021_invalid", "2022_invalid"], 1], + ["lplef", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000010351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", ["2021_invalid", "2022_invalid"], 1], + ["79z0d", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000000100000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["hk7nq", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000252000000000000000000000000000000000000000000000000000000000000000010351c88700000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["tzw9j", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c875", ["2021_invalid", "2022_valid"], 1], + ["xpk79", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142852124534d57bd929d21b449e610ee22fe8746487", ["2021_invalid", "2022_standard"], 1], + ["kd3jc", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c875", ["2021_invalid", "2022_valid"], 1], + ["yutz9", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ff238384415a79cdc5115d0469e3fe1f8153b45e87", ["2021_invalid", "2022_standard"], 1], + ["e27rx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c875", ["2021_invalid", "2022_invalid"], 1], + ["kgqpx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914523e07ae6a2269faca32b65b14acd07ccbda0e5e87", ["2021_invalid", "2022_invalid"], 1], + ["qy39t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc875", ["2021_invalid", "2022_invalid"], 1], + ["nwg49", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140ad568a49f50fb90af00472519b23ff584cb7ed087", ["2021_invalid", "2022_invalid"], 1], + ["rnf4n", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c875", ["2021_invalid", "2022_invalid"], 1], + ["mwv2r", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787", ["2021_invalid", "2022_invalid"], 1], + ["p8e6t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c875102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["j9xf0", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c8750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["3ss4h", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d5300000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f7587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["zmwmj", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000022012a5d531d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f758700000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a91421c219da675eae84da66fa2f4b9f70bff74b73fd87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["c8x8a", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (nonP2SH)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c987", ["2021_invalid", "2022_valid"], 1], + ["jj689", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (P2SH20)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914150150967a345cee132e10ed63ee8b2e2127183387", ["2021_invalid", "2022_standard"], 1], + ["43nsl", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", ["2021_invalid", "2022_valid"], 1], + ["annu3", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", ["2021_invalid", "2022_standard"], 1], + ["0852u", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (nonP2SH)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", ["2021_invalid", "2022_invalid"], 1], + ["wrqea", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (P2SH20)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", ["2021_invalid", "2022_invalid"], 1], + ["arjyx", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["sm9kp", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351c98700000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["ecauy", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c975", ["2021_invalid", "2022_valid"], 1], + ["qmew2", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144e84cbaea6f9b66166ea14eea76df537192c4cbd87", ["2021_invalid", "2022_standard"], 1], + ["9cgnu", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c975", ["2021_invalid", "2022_valid"], 1], + ["2ljft", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4726b6ab589e3bf19ac1628d97db9a9bc77517487", ["2021_invalid", "2022_standard"], 1], + ["ael35", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c975", ["2021_invalid", "2022_invalid"], 1], + ["drlfk", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453c8a5a4de090d9a337c7db83f2c443a9605d8c387", ["2021_invalid", "2022_invalid"], 1], + ["uugrq", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc975", ["2021_invalid", "2022_invalid"], 1], + ["yw80j", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145e9af27552de9ba7a9bea88b5aa0ff55bf6e3e8387", ["2021_invalid", "2022_invalid"], 1], + ["4djj0", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c975", ["2021_invalid", "2022_invalid"], 1], + ["f34c4", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ef1c56fca391fa18de57061d8184c057335523087", ["2021_invalid", "2022_invalid"], 1], + ["44xf8", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c975102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["yv2hj", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c9750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a9141ef1c56fca391fa18de57061d8184c057335523087102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["0ma3s", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300c9008851c951c98853c9885dc988012ac987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["rtkyc", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300c9008851c951c98853c9885dc988012ac9870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a852b37c118384a3655d0a3c92af3bfa806466c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["p3v45", "Transaction inspection: OP_INPUTBYTECODE (input 0) (nonP2SH)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000068ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587", ["2021_invalid", "2022_valid"], 1], + ["vyy3e", "Transaction inspection: OP_INPUTBYTECODE (input 0) (P2SH20)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000006b004c68ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450d51b25a7868fe6adf200440c53d0e0e6be9eb987", ["2021_invalid", "2022_standard"], 1], + ["sdgfd", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004ca015187", ["2021_invalid", "2022_valid"], 1], + ["0xhy0", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (P2SH20)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104ca015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144518d7d2d7c5e959b74d272957abb3a4e22f511787", ["2021_invalid", "2022_invalid"], 1], + ["prtnj", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (nonP2SH)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000351ab51000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000769ca0351ab5187", ["2021_invalid", "2022_valid"], 1], + ["5yxye", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (P2SH20)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b51ab510769ca0351ab5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d2742d27a3ea54a2fefae6733492b5258cd87cbd87", ["2021_invalid", "2022_invalid"], 1], + ["8wnzm", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (nonP2SH)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000d76827c7eab77767eab51ca8851", ["2021_invalid", "2022_invalid"], 1], + ["d5ul4", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (P2SH20)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c0d76827c7eab77767eab51ca88510d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fd6a26edcde4ccca609c63dc5c6d7005cb725cb387", ["2021_invalid", "2022_standard"], 1], + ["2wrww", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017ca527faba902a9147c7e01877eab51c788517f75015187", ["2021_invalid", "2022_invalid"], 1], + ["cz7ah", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (P2SH20)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000195117ca527faba902a9147c7e01877eab51c788517f75015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146e426e71ad390256f8e7a2dd7b88b139bf73eb6e87", ["2021_invalid", "2022_standard"], 1], + ["47zzy", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003ca5187", ["2021_invalid", "2022_invalid"], 1], + ["rwe6p", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (P2SH20)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000055103ca5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fdfd3039b9c13e2268314e703118bf57a227a16b87", ["2021_invalid", "2022_invalid"], 1], + ["x7n7u", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300ca75", ["2021_invalid", "2022_valid"], 1], + ["zp9gc", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b42626d4d54774b8be5bf423dbd422e21851914887", ["2021_invalid", "2022_standard"], 1], + ["9gg2c", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351ca75", ["2021_invalid", "2022_valid"], 1], + ["9maeh", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91429a5bf683d386c8f65dc5ccb8f22766fec8e787387", ["2021_invalid", "2022_standard"], 1], + ["847mu", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100ca75", ["2021_invalid", "2022_invalid"], 1], + ["c9vma", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5b73676cda7241ca379713603db7ca1f3e0ea0c87", ["2021_invalid", "2022_invalid"], 1], + ["33hhj", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fca75", ["2021_invalid", "2022_invalid"], 1], + ["rs7er", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a20ef8fa3dc1d87aa73ee6e2ddd706a23e8e5de87", ["2021_invalid", "2022_invalid"], 1], + ["ts7nd", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352ca75", ["2021_invalid", "2022_invalid"], 1], + ["f89ml", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914266206a75755c70c126f777448e6a410391d637687", ["2021_invalid", "2022_invalid"], 1], + ["dlnwf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352ca75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["r93tx", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352ca750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a914266206a75755c70c126f777448e6a410391d637687102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["x4vrl", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (nonP2SH)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000240802002a0402002a870802000d0402000d870802000704020007870802000104020001870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001200ca00ca8851ca8857ca885dca88012aca87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987", ["2021_invalid", "2022_valid"]], + ["akjnr", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (P2SH20)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000370802002a0402002a870802000d0402000d870802000704020007870802000104020001871200ca00ca8851ca8857ca885dca88012aca870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914430f061cc80ff742b57e328bc3401c1a210e5d7b87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987", ["2021_invalid", "2022_standard"]], + ["j2z86", "Transaction inspection: OP_INPUTBYTECODE (maximum size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd0f024d08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030451ca8777", ["2021_invalid", "2022_valid"], 1], + ["lsjpv", "Transaction inspection: OP_INPUTBYTECODE (excessive size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd10024d09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040551ca8777", ["2021_invalid", "2022_invalid"], 1], + ["dtx7r", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0302514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", ["2021_invalid", "2022_valid"], 1], + ["3fuxn", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0802514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", ["2021_invalid", "2022_standard"], 1], + ["s23zf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0a02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", ["2021_invalid", "2022_invalid"], 1], + ["v0689", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", ["2021_invalid", "2022_invalid"], 1], + ["ne0zn", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (nonP2SH)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb87", ["2021_invalid", "2022_valid"], 1], + ["ysc4e", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (P2SH20)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387", ["2021_invalid", "2022_standard"], 1], + ["l46dz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (nonP2SH)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", ["2021_invalid", "2022_valid"], 1], + ["sgtuu", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (P2SH20)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", ["2021_invalid", "2022_standard"], 1], + ["wsnyq", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", ["2021_invalid", "2022_invalid"], 1], + ["zku65", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", ["2021_invalid", "2022_invalid"], 1], + ["mnn9j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["9l0lg", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["32g8j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000300cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["z0e7y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000300cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["flpv2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff00feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["2hpht", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17500cb87feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["80zyt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_invalid"]], + ["xwd6l", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17500cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_invalid"]], + ["8pgnz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["nu30y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["ljmun", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["n9jyd", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["x6sc5", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["uyrhw", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["xuj8t", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb75", ["2021_invalid", "2022_valid"], 1], + ["gtfha", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bdaf8ccc75208c9d548c1690337db42ae19a036487", ["2021_invalid", "2022_standard"], 1], + ["ej6ln", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb75", ["2021_invalid", "2022_valid"], 1], + ["a0s38", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914498874323743a9d189a4cea2e0f31ae18677376487", ["2021_invalid", "2022_standard"], 1], + ["fc7sf", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100cb75", ["2021_invalid", "2022_invalid"], 1], + ["qpnt2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7b7c219eda22932c71ff387ecf8b5fbe0276bad87", ["2021_invalid", "2022_invalid"], 1], + ["khjgz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcb75", ["2021_invalid", "2022_invalid"], 1], + ["n2cms", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144d11fe0414239057aa155fe2ec9fbb766c7d6e3c87", ["2021_invalid", "2022_invalid"], 1], + ["05f3k", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cb75", ["2021_invalid", "2022_invalid"], 1], + ["m9zlt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887", ["2021_invalid", "2022_invalid"], 1], + ["lfxk6", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352cb75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["gq4nl", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352cb750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["su5t7", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300cb008851cb51cb8853cb885dcb88012acb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_valid"]], + ["rc9d3", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300cb008851cb51cb8853cb885dcb88012acb870000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914d4d1ce02ebaab2d5f8cda5c0acd1d89656596b4187102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87", ["2021_invalid", "2022_standard"]], + ["9dfdk", "Transaction inspection: OP_OUTPUTVALUE (output 0) (nonP2SH)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", ["2021_invalid", "2022_valid"], 1], + ["6tm5y", "Transaction inspection: OP_OUTPUTVALUE (output 0) (P2SH20)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", ["2021_invalid", "2022_standard"], 1], + ["jtuew", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", ["2021_invalid", "2022_invalid"], 1], + ["6terc", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", ["2021_invalid", "2022_invalid"], 1], + ["n2dmk", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d61a9c8e40887e2bd241707d1ddb6e2730e4e87aeca1e9a5175b4a2042ed36c73beb5c9bee7c2b95e8856a3b31dd3e5ab55c0262eadd942a996859a5fd426076c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000110270000000000000300cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", ["2021_invalid", "2022_valid"], 1], + ["r8w8x", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441220ce6fcca0aeef27e808bb730d1c3c371f06298e79fd0948911795308c9e0916f405ce7c8465c4a6c0969a95bc1d45c35d44ef834ca733b0ea50052fb8c2796c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc870000000001102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b6488700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", ["2021_invalid", "2022_standard"], 1], + ["0a403", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc75", ["2021_invalid", "2022_valid"], 1], + ["wy0q9", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145a1dede50254d70a00eec28c70029401bf888efa87", ["2021_invalid", "2022_standard"], 1], + ["t237p", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cc75", ["2021_invalid", "2022_invalid"], 1], + ["7auug", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e5cafd4ef09b908959aa8c4bbe12b2cba38f4be787", ["2021_invalid", "2022_invalid"], 1], + ["ec2zv", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (nonP2SH)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411cc4abed5d58f1236ae7b462b587d0db9af0a83e2867c6d065db42e7ea5d440a81383d29c05764bf4d2ba55f67cf245825b4aaa3b43eb1b5d4c68e9257c75abac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcc751127000000000000034fcc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcc75", ["2021_invalid", "2022_invalid"], 1], + ["8g609", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (P2SH20)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e60ec935181e309b69033f80e6e8ef4954c47b5193628500c4852faa94e6336dfe0463d5a07bd2a10f4f20c74c02b4fad477441e367b1dff5be81b84cbf97225c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcc750000000002102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487112700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de348700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487", ["2021_invalid", "2022_invalid"], 1], + ["7kz9t", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cc7511270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", ["2021_invalid", "2022_invalid"], 1], + ["s3kn5", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000002102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", ["2021_invalid", "2022_invalid"], 1], + ["35z4f", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cc7511270000000000000352cc7512270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", ["2021_invalid", "2022_valid"], 1], + ["xjk3x", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000003102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587122700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", ["2021_invalid", "2022_standard"], 1], + ["v7rla", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (nonP2SH)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441337957e0102253ea781600e6016bdc119f57a88e9da12413354d6b2c105fadc65a7a5708515991b2cc66a020df73f6f27f8b3789e4ad5494d18ac32e552267acc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c023a27021d27021727021127000000003210270000000000001200cc00cc8851cc8857cc885dcc88012acc8711270000000000001200cc00cc8851cc8857cc885dcc88012acc8712270000000000001200cc00cc8851cc8857cc885dcc88012acc8713270000000000001200cc00cc8851cc8857cc885dcc88012acc8714270000000000001200cc00cc8851cc8857cc885dcc88012acc8715270000000000001200cc00cc8851cc8857cc885dcc88012acc8716270000000000001200cc00cc8851cc8857cc885dcc88012acc8717270000000000001200cc00cc8851cc8857cc885dcc88012acc8718270000000000001200cc00cc8851cc8857cc885dcc88012acc8719270000000000001200cc00cc8851cc8857cc885dcc88012acc871a270000000000001200cc00cc8851cc8857cc885dcc88012acc871b270000000000001200cc00cc8851cc8857cc885dcc88012acc871c270000000000001200cc00cc8851cc8857cc885dcc88012acc871d270000000000001200cc00cc8851cc8857cc885dcc88012acc871e270000000000001200cc00cc8851cc8857cc885dcc88012acc871f270000000000001200cc00cc8851cc8857cc885dcc88012acc8720270000000000001200cc00cc8851cc8857cc885dcc88012acc8721270000000000001200cc00cc8851cc8857cc885dcc88012acc8722270000000000001200cc00cc8851cc8857cc885dcc88012acc8723270000000000001200cc00cc8851cc8857cc885dcc88012acc8724270000000000001200cc00cc8851cc8857cc885dcc88012acc8725270000000000001200cc00cc8851cc8857cc885dcc88012acc8726270000000000001200cc00cc8851cc8857cc885dcc88012acc8727270000000000001200cc00cc8851cc8857cc885dcc88012acc8728270000000000001200cc00cc8851cc8857cc885dcc88012acc8729270000000000001200cc00cc8851cc8857cc885dcc88012acc872a270000000000001200cc00cc8851cc8857cc885dcc88012acc872b270000000000001200cc00cc8851cc8857cc885dcc88012acc872c270000000000001200cc00cc8851cc8857cc885dcc88012acc872d270000000000001200cc00cc8851cc8857cc885dcc88012acc872e270000000000001200cc00cc8851cc8857cc885dcc88012acc872f270000000000001200cc00cc8851cc8857cc885dcc88012acc8730270000000000001200cc00cc8851cc8857cc885dcc88012acc8731270000000000001200cc00cc8851cc8857cc885dcc88012acc8732270000000000001200cc00cc8851cc8857cc885dcc88012acc8733270000000000001200cc00cc8851cc8857cc885dcc88012acc8734270000000000001200cc00cc8851cc8857cc885dcc88012acc8735270000000000001200cc00cc8851cc8857cc885dcc88012acc8736270000000000001200cc00cc8851cc8857cc885dcc88012acc8737270000000000001200cc00cc8851cc8857cc885dcc88012acc8738270000000000001200cc00cc8851cc8857cc885dcc88012acc8739270000000000001200cc00cc8851cc8857cc885dcc88012acc873a270000000000001200cc00cc8851cc8857cc885dcc88012acc873b270000000000001200cc00cc8851cc8857cc885dcc88012acc873c270000000000001200cc00cc8851cc8857cc885dcc88012acc873d270000000000001200cc00cc8851cc8857cc885dcc88012acc873e270000000000001200cc00cc8851cc8857cc885dcc88012acc873f270000000000001200cc00cc8851cc8857cc885dcc88012acc8740270000000000001200cc00cc8851cc8857cc885dcc88012acc8741270000000000001200cc00cc8851cc8857cc885dcc88012acc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cc00cc8851cc8857cc885dcc88012acc87", ["2021_invalid", "2022_valid"], 1], + ["jjmth", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (P2SH20)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441376a3c3cf7345e31982bf5b85792d3b3da802d2c704b8d0b6244e6255b42a5a7895a605ce24ff626f0fcd02daa3ed451de70eb12f84ddc7d792a6442af7f435bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f023a27021d270217270211271200cc00cc8851cc8857cc885dcc88012acc870000000032102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87112700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87122700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87132700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87142700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87152700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87162700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87172700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87182700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87192700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87202700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87212700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87222700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87232700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87242700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87252700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87262700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87272700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87282700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87292700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87302700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87312700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87322700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87332700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87342700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87352700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87362700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87372700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87382700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87392700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87402700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87412700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87", ["2021_invalid", "2022_standard"], 1], + ["d3e4s", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411914d1d16f673884038b449f7090a0d3c657148c3fd3cc190d2290a4d65884d9432c0a3dd67c6d57fabe62ec832e90697971e0f38ba8d1c88ca00908c21d3f2dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060415cd5b0700000000000115cd5b070000000002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", ["2021_invalid", "2022_valid"], 1], + ["hfsgn", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441aa25ded491ef8724bcd372e0900d0a5ef3855495862b443948252c35e05b9a5c97b64f749f7c5dad84d0a4f1edb560da8bc147b003acff0f7117186fe6116050c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090415cd5b070002cc87000000000115cd5b070000000017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", ["2021_invalid", "2022_standard"], 1], + ["6r2qt", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d098cb4d916b27db8b87cd5f3c3d2217db455c3da3b43b81e45fde35783c44e4a2d100175c6a77d21e3ac5e5ccc1b5aff22ae3d5b0474b464b84c1bebe972b57c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009070040075af075070000000000010040075af075070002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", ["2021_invalid", "2022_valid"], 1], + ["3fp95", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441fcf93fb29e1777a54a66cb1b8282b693c70e857f520b1406a05072cd79c04fbb698bd4c81b112e1ebed63743aaaadb1fccc85f8ca6bc492c6c68afff34b365c5c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c070040075af075070002cc8700000000010040075af075070017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", ["2021_invalid", "2022_standard"], 1], + ["8jy9k", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441da662ce444d3cd6a30cb9dd4692ba617e5d81dfb784076e4ae07662bfe71db735a2a3224a0b2f83130c289e2361eeb325e94236b605b27bf75b9aded47559e8bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a08ffffffffffffff7f000000000001ffffffffffffff7f02cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", ["2021_invalid", "2022_valid"], 1], + ["phwq6", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e2d18cd10452d690465bc66f516fc721f3f427c8855b8e735645d50a28c3c6e4efe07f81e2dc97ce535b6f09015e8057b0ebd780e196ea91dcc75154acd5b504c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d08ffffffffffffff7f0002cc870000000001ffffffffffffff7f17a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", ["2021_invalid", "2022_standard"], 1], + ["qy9xt", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644120d73f4435c2901df73c8fb5e7ea68a9548aceb72f34c37a3dd4ba4870c04e562cb934056d2a8faeef6609dd47ebcc678430607f3f1e873fdf059e8bd069e888c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b09000000000000008000000000000001000000000000008002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", ["2021_invalid", "2022_invalid"], 1], + ["cra58", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644154d8a3508ce703e59cff49ccf62e2321c8e90337db623028ba2399368ffbad7c98a2c39a5e27a72d3ddf80c080c1e50661d5ee3b2a97361857ea80b132c424bbc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e090000000000000080000002cc870000000001000000000000008017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", ["2021_invalid", "2022_invalid"], 1], + ["efhhm", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a6a08766d625f74657374000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", ["2021_invalid", "2022_valid"], 1], + ["d2ve9", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0a6a08766d625f746573740300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", ["2021_invalid", "2022_standard"], 1], + ["sj69g", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", ["2021_invalid", "2022_invalid"], 1], + ["4zqq3", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", ["2021_invalid", "2022_invalid"], 1], + ["dkajw", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a00000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", ["2021_invalid", "2022_valid"], 1], + ["3wjnv", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd8700000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", ["2021_invalid", "2022_standard"], 1], + ["5flt6", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (nonP2SH)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040375ab51000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000400abcd87", ["2021_invalid", "2022_valid"], 1], + ["5msmp", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (P2SH20)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090375ab510400abcd87000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ddb90ed315acb3ebe30542f597c8fe1d9dec8c2287", ["2021_invalid", "2022_valid"], 1], + ["vqx55", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", ["2021_invalid", "2022_valid"], 1], + ["jk2p8", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", ["2021_invalid", "2022_standard"], 1], + ["myk99", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cd75", ["2021_invalid", "2022_invalid"], 1], + ["x9306", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0667ad0678c5ac9189d611b7feb1ba9857040eb87", ["2021_invalid", "2022_invalid"], 1], + ["mkmyw", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (nonP2SH)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064415d67fee69ca11c78082eea7c40b227af8c93a65d05d77778723ddd324419a8fc82317672e98f8d2718e619f090c7c824c5678088792155426f6f48f5611e3bddc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcd751127000000000000034fcd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcd75", ["2021_invalid", "2022_invalid"], 1], + ["fshgr", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (P2SH20)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644108e647f5721201530190228be5b6c5d66d259a1b451c18e0070b90dc73233a7a37108c1cb8a3723400278d0f79677929f8e18e44f24b89d86175b7b1c69bf912c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcd750000000002102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887112700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d788700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887", ["2021_invalid", "2022_invalid"], 1], + ["44p7j", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cd7511270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", ["2021_invalid", "2022_invalid"], 1], + ["xvtvk", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000002102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", ["2021_invalid", "2022_invalid"], 1], + ["pw0vv", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cd7511270000000000000352cd7512270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", ["2021_invalid", "2022_valid"], 1], + ["5rg92", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000003102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787122700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", ["2021_invalid", "2022_standard"], 1], + ["9dcw7", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (nonP2SH)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d036a012a026a5d026a57026a5100000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cd00cd8851cd8857cd885dcd88012acd87", ["2021_invalid", "2022_valid"], 1], + ["v0pn5", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (P2SH20)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000020036a012a026a5d026a57026a511200cd00cd8851cd8857cd885dcd88012acd8700000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91497ab1496d1f9599b44ebfaa166acc0852f35524387", ["2021_invalid", "2022_standard"], 1], + ["h4ml9", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", ["2021_invalid", "2022_valid"], 1], + ["yvnt8", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030300cd8700000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", ["2021_invalid", "2022_valid"], 1], + ["6nju2", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0c024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", ["2021_invalid", "2022_invalid"], 1], + ["36d8k", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd10024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040300cd8700000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", ["2021_invalid", "2022_invalid"], 1], + ["y8zh2", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", ["2021_invalid", "2022_valid"], 1], + ["j4axz", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", ["2021_invalid", "2022_valid"], 1], + ["qkz9v", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", ["2021_invalid", "2022_invalid"], 1], + ["vf3j5", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", ["2021_invalid", "2022_invalid"], 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_invalid.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_invalid.json new file mode 100644 index 00000000..2e035fe5 --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_invalid.json @@ -0,0 +1,561 @@ +[ + ["cjtdh", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (nonP2SH)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000101000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825187", 1], + ["urv4v", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (P2SH20)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050103825187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914348babd902f9237b6d28ad1ee00bf6941bc9bddc87", 1], + ["rstq5", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (nonP2SH)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825287", 1], + ["hzs5f", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (P2SH20)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006020003825287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a28702ab5f8e62b7bee8a86d5dba82d797553ff287", 1], + ["3slvl", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (nonP2SH)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825387", 1], + ["9656c", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (P2SH20)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006030003825387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146908ef2fea5347219d7bbde297594d7f88b9ecf787", 1], + ["r76hz", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (nonP2SH)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825487", 1], + ["wnm0h", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (P2SH20)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006040003825487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914741dd8ac897f1921080f1349f0e499133570c7ae87", 1], + ["6eav8", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (nonP2SH)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825587", 1], + ["ludss", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (P2SH20)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050003825587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea47aa431f680ac44ad2630de7928853e5e9014087", 1], + ["lylne", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (nonP2SH)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825687", 1], + ["ywkn9", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (P2SH20)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006060003825687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143c5bd113c470fb925caad11fd469330cb3533cf487", 1], + ["hw0cc", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (nonP2SH)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825787", 1], + ["6jasz", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (P2SH20)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006070003825787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149b2e07b931c3f3f2fa432caf4942dc0439ae183e87", 1], + ["s6kau", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (nonP2SH)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825887", 1], + ["gvnl3", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (P2SH20)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006080003825887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f5401712c7ce3cc2f37cbcd59c2af053459d88eb87", 1], + ["zdmgv", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (nonP2SH)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825987", 1], + ["0xlnr", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (P2SH20)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006090003825987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142fcca85da981948d44ab5b0bb5c2df85df2fded787", 1], + ["rwech", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (nonP2SH)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825a87", 1], + ["sewrg", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (P2SH20)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060a0003825a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413d1522e20ec54a2eb73cf826dec934764816e4387", 1], + ["2v8c9", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (nonP2SH)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825b87", 1], + ["qqfhd", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (P2SH20)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060b0003825b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493f3f936705cdc5a08360e9ce6e0d60f41051fdb87", 1], + ["efukg", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (nonP2SH)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825c87", 1], + ["f720n", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (P2SH20)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060c0003825c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6e50e78a1ffeb9964e151606ea7c3b1dc7c53c087", 1], + ["rwt2g", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (nonP2SH)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825d87", 1], + ["we4vd", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (P2SH20)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060d0003825d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91488e5db69290eaeaad7ecf2c0b879f49efe8706d187", 1], + ["jr9uh", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (nonP2SH)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825e87", 1], + ["77a6m", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (P2SH20)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060e0003825e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7e842cce119144e30c2459752d1953abc66247b87", 1], + ["3wz54", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (nonP2SH)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825f87", 1], + ["auhc8", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (P2SH20)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060f0003825f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914adabaf24212d2e068002b878c591dbcfbda6afb487", 1], + ["sp7ca", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (nonP2SH)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003826087", 1], + ["sthyn", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (P2SH20)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006100003826087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7f943bd2f61decaf4474763cdfe18ae4f178fc187", 1], + ["0zykz", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (nonP2SH)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011187", 1], + ["5z4zh", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (P2SH20)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000711000482011187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fede7df4488fa102dbd016ac8a73b687f1d3f987", 1], + ["k07lm", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (nonP2SH)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011287", 1], + ["zwj6u", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (P2SH20)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000712000482011287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145c75f97e9d4e8860ff31ca63ff47c28510ce212987", 1], + ["6uvj0", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (nonP2SH)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011387", 1], + ["t57la", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (P2SH20)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000713000482011387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3e18c9a3e88665d35b9bb07467088899cdccb6b87", 1], + ["03nhu", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (nonP2SH)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011487", 1], + ["rfd4e", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (P2SH20)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000714000482011487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ef6a89a2dbf92a35a991b641e39d73d923ff564287", 1], + ["nxxh7", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (nonP2SH)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011587", 1], + ["sun00", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (P2SH20)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000715000482011587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140d642007e078cc5bc88b7d72ccfd5938037be61787", 1], + ["f6sw0", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (nonP2SH)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011687", 1], + ["usg5s", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (P2SH20)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000716000482011687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e899033933457a8b58ae3480efba8afd3a754b5587", 1], + ["mhhlj", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (nonP2SH)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011787", 1], + ["shnln", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (P2SH20)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000717000482011787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ce4ea52361a4620b9f4eeb29d82310f382047fa87", 1], + ["jsd8m", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (nonP2SH)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011887", 1], + ["l4958", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (P2SH20)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000718000482011887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91449e7ca1c481e274a893e269da75e9f1d8660b8a187", 1], + ["08tlq", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (nonP2SH)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011987", 1], + ["xs9lz", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (P2SH20)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000719000482011987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914261928ca6985d6fd387f73bebd1f5207d4af3b9a87", 1], + ["xqf3t", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (nonP2SH)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011a87", 1], + ["j9khk", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (P2SH20)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071a000482011a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91435590178ced6b0bd207c26ade7a3cd0f4d104aeb87", 1], + ["0yspc", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (nonP2SH)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011b87", 1], + ["ktaak", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (P2SH20)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071b000482011b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143cb151081f4f762db4b60e42ef7dbce285b3690e87", 1], + ["68faz", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (nonP2SH)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011c87", 1], + ["akgmy", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (P2SH20)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071c000482011c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fbac4fa369bb6b5ee0942cd666f10a0ab0dbe1cb87", 1], + ["3vzsq", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (nonP2SH)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011d87", 1], + ["nj273", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (P2SH20)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071d000482011d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144b497de2489d2cb22d14e22a276440b00e8cbac487", 1], + ["n00p5", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (nonP2SH)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011e87", 1], + ["63ut4", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (P2SH20)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071e000482011e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143b9ccee9e96b7db838fc26158ee6ba585069a24187", 1], + ["3c78h", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (nonP2SH)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011f87", 1], + ["m2c3w", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (P2SH20)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071f000482011f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b45ae13294f970aa8f50c66828539778c80595d87", 1], + ["3lqaf", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (nonP2SH)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012087", 1], + ["57kr0", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (P2SH20)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000720000482012087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c8c6e9f8eed13bf72da94979c5a9c2353f07c4b287", 1], + ["726sl", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (nonP2SH)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012187", 1], + ["cp63m", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (P2SH20)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000721000482012187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145bbe16fe0c60055a980236177c71e53bda38980187", 1], + ["m2pgy", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (nonP2SH)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012287", 1], + ["ytyk0", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (P2SH20)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000722000482012287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f06972a2da955429c9486e9ad231c2ddacd58cdd87", 1], + ["ch34h", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (nonP2SH)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012387", 1], + ["ng6g7", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (P2SH20)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000723000482012387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac251aed5594e5f076286e8279e77f9dd0b2e3fa87", 1], + ["agpjz", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (nonP2SH)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012487", 1], + ["7lt9h", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (P2SH20)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000724000482012487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d7a1bb2ec0506846b456c6760d476c9119eab9eb87", 1], + ["hx5he", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (nonP2SH)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012587", 1], + ["9x5vu", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (P2SH20)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000725000482012587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149672ea177e21140bdf00340f1319c204759bc80d87", 1], + ["hd49m", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (nonP2SH)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012687", 1], + ["463m0", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (P2SH20)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000726000482012687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b97c51aa9846d3a1592a9716c72c59ea4014987b87", 1], + ["vr0ap", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (nonP2SH)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012787", 1], + ["xk5qu", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (P2SH20)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000727000482012787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914838dbf4b707c1c3d7209b35a80038a3e9a4aba3987", 1], + ["c0hkx", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (nonP2SH)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012887", 1], + ["3zfmh", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (P2SH20)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000728000482012887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ce9ab280b9bee5b3ef211315f64f010da4f136bb87", 1], + ["5er5d", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (nonP2SH)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012987", 1], + ["hk4vz", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (P2SH20)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000729000482012987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f7f83137b5abd79af7978c2935fd51d359d9344087", 1], + ["8dnek", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (nonP2SH)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012a87", 1], + ["snlma", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (P2SH20)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072a000482012a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a0d4b834bca78c0f87651005aaf094f6c170ebbb87", 1], + ["yk8ar", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (nonP2SH)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012b87", 1], + ["5l8ag", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (P2SH20)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072b000482012b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d553e97ceedb09c47ddc8c82ea9751a9e672f3ad87", 1], + ["u4m20", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (nonP2SH)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012c87", 1], + ["aadqw", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (P2SH20)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072c000482012c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442d209c70c3252e8592a302b370e389c03603ba787", 1], + ["m5d87", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (nonP2SH)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012d87", 1], + ["2q8yj", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (P2SH20)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072d000482012d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4465c868597e9da5cc428abdaeaf8d99c399fc787", 1], + ["zujyx", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (nonP2SH)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012e87", 1], + ["h7ed9", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (P2SH20)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072e000482012e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2783126d377a9c037f7c7136648757bb69f384087", 1], + ["5k5tw", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (nonP2SH)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012f87", 1], + ["zetm9", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (P2SH20)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072f000482012f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457886f74abe49501fb9f95f1bfbf7c14c16261a387", 1], + ["n542h", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (nonP2SH)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013087", 1], + ["f4rnf", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (P2SH20)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000730000482013087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149e97523dae1574eba4f062a427df6f092328a66b87", 1], + ["ztcwm", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (nonP2SH)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013187", 1], + ["n7rym", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (P2SH20)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000731000482013187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147025024f84e2c86c8c05a156fb243ca26f0e7ddf87", 1], + ["828hc", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (nonP2SH)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013287", 1], + ["l699u", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (P2SH20)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000732000482013287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148c8078e43e6ef3e18f396ec279cccd6d2f5a649b87", 1], + ["7vy7j", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (nonP2SH)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013387", 1], + ["acy6z", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (P2SH20)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000733000482013387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145551ae7ed8b3dd2e51a20fc7b2682e4f54eacbc787", 1], + ["y8ekq", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (nonP2SH)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013487", 1], + ["merlz", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (P2SH20)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000734000482013487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ece2479209ed0af01756bd0b47812853b7f1168387", 1], + ["9xurn", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (nonP2SH)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013587", 1], + ["3snm2", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (P2SH20)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000735000482013587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143ed2c324417d30554e82149f8f022da37092148787", 1], + ["6pjry", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (nonP2SH)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013687", 1], + ["lg2me", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (P2SH20)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000736000482013687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406aa492e4966756df323848855324d1511cc87c187", 1], + ["fnzp8", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (nonP2SH)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013787", 1], + ["v35ax", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (P2SH20)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000737000482013787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acc5c8a4754c20a98bd5489c16d4018d53970bfe87", 1], + ["nstfa", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (nonP2SH)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013887", 1], + ["h0q87", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (P2SH20)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000738000482013887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149806a867af459eae3edeac36e5c5f59681a11f0987", 1], + ["k7k3z", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (nonP2SH)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013987", 1], + ["62s9p", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (P2SH20)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000739000482013987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fa98af27368e371f91fed7fb5234f87719e7b1187", 1], + ["ln6zz", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (nonP2SH)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013a87", 1], + ["4peq4", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (P2SH20)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073a000482013a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142f28b13b3bb4dc030bc0c42485532fd6277b80ab87", 1], + ["48lr4", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (nonP2SH)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013b87", 1], + ["6wemr", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (P2SH20)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073b000482013b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b582383b7c0b8064929c7c696f7ff4e8ddce223087", 1], + ["ucetn", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (nonP2SH)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013c87", 1], + ["7he3a", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (P2SH20)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073c000482013c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149d2262652be5fc894a7a0bafd1b0c6b476f4846887", 1], + ["4suq3", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (nonP2SH)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013d87", 1], + ["zu22a", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (P2SH20)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073d000482013d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914853db769d22bcbf776b88009a04b04a8e4c261ba87", 1], + ["q9prv", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (nonP2SH)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013e87", 1], + ["2ld7h", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (P2SH20)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073e000482013e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142530b28ab0b0f7e276a0dbf4722a9aa532fbad7387", 1], + ["ev7mq", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (nonP2SH)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013f87", 1], + ["jzls3", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (P2SH20)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073f000482013f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146f3c7317731b7a41f05fb504d2e2346f21324ff687", 1], + ["54w6p", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (nonP2SH)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014087", 1], + ["f3egp", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (P2SH20)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000740000482014087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453eade5230e2ba9b605e24693640e4765b9bcf7b87", 1], + ["echpm", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (nonP2SH)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014187", 1], + ["jtanj", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (P2SH20)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000741000482014187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914407ca521c9b3cfdcaf5dd625ab017115b1e8fc0e87", 1], + ["h4aqg", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (nonP2SH)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014287", 1], + ["gtg76", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (P2SH20)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000742000482014287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a6e064b20d85e79ee9cf64b2395e82f4c2be57e687", 1], + ["r776d", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (nonP2SH)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014387", 1], + ["0a7tu", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (P2SH20)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000743000482014387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5325cb585f9efd9556afb055372f9f8fecd3dc687", 1], + ["u763z", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (nonP2SH)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014487", 1], + ["0nv6m", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (P2SH20)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000744000482014487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf8a760b88077e0546b9d7cd072afa779ff98ac987", 1], + ["aduhz", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (nonP2SH)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014587", 1], + ["0azna", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (P2SH20)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000745000482014587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b3ab6b69d924ae006e576b577e0d2d4c994ac5aa87", 1], + ["r36zv", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (nonP2SH)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014687", 1], + ["mhkav", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (P2SH20)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000746000482014687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144bb6e78bebb29d6c041e5a19cbdeb53b5ef04ee287", 1], + ["42w39", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (nonP2SH)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014787", 1], + ["gscmv", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (P2SH20)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000747000482014787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91479f1f5998ddca7c4e2b672afc5a26b2b8b2ffb4187", 1], + ["lcxtm", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (nonP2SH)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014887", 1], + ["glvlg", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (P2SH20)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000748000482014887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e652aaf57b7198f80e3b78401c89cd96c6a6c8bd87", 1], + ["z3t06", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (nonP2SH)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014987", 1], + ["hvje4", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (P2SH20)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000749000482014987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141cef04ad6c1fe8e610323192fe4058df0c91d6c987", 1], + ["zja07", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (nonP2SH)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014a87", 1], + ["r3ycz", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (P2SH20)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074a000482014a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c791c5359a5b6631fd28c4a359221c40af95ec4887", 1], + ["kgq43", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (nonP2SH)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014b87", 1], + ["j4r6x", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (P2SH20)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074b000482014b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac95375c38c1922bea1a42ab755832d3474d9d5a87", 1], + ["x8uj0", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000451635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["7jru3", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006516350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["txj23", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", 1], + ["y5xzt", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", 1], + ["cd60d", "Disabled/failing operations: OP_VER fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", 1], + ["p4v07", "Disabled/failing operations: OP_VER fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", 1], + ["dk9kf", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463656851", 1], + ["n0ye4", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463656851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457dc1a70809660410571bdb537e003fec3428bc487", 1], + ["j865d", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463666851", 1], + ["pcrac", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463666851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914403de1b3ab6d2cfa5fb35620f088769beb080f0287", 1], + ["f8605", "Disabled/failing operations: OP_RETURN fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", 1], + ["j8gj8", "Disabled/failing operations: OP_RETURN fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", 1], + ["z5zyz", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463836851", 1], + ["5xw0n", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463836851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149a24bd2a162d0f4df5fe7fef6d66fccacd0e5f9887", 1], + ["9m6kt", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", 1], + ["z3rkc", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", 1], + ["a7c26", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", 1], + ["u5wae", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", 1], + ["alwy0", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638d6851", 1], + ["s49g9", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638d6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141aa1b8bcc573b4fe778d7912487101446b016e9187", 1], + ["g3qe3", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638e6851", 1], + ["jnfe2", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638e6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142acbb440e71f59b71efdfc6d81954b7dc7130c7587", 1], + ["2q4a4", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463986851", 1], + ["49r5l", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463986851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a2ec10dbc7a3ba53b6836c48756ad98a50543ff87", 1], + ["9t87w", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463996851", 1], + ["su3pf", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463996851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145cf960dc2e4d0da4a3642b8ac200d39faca2675587", 1], + ["tqlk6", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c068c0c087", 1], + ["alcrs", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c068c0c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea3868cab03ec45c9868fe7d658511c73d12243c87", 1], + ["seaka", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c168c1c187", 1], + ["2assf", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c168c1c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914477b47786ea1fb2e90f5cc2c4acdd3e376815a7287", 1], + ["apa8e", "Conditionally executed operations: OP_TXVERSION is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c268c2c287", 1], + ["lguf9", "Conditionally executed operations: OP_TXVERSION is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c268c2c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91420f70f0d60b4457ccd9efe9990dd5f18c67e5feb87", 1], + ["mzu8u", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c368c3c387", 1], + ["n2ylt", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c368c3c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914850d090785681c32fd42795b106efe894555c08987", 1], + ["zw3pl", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c468c4c487", 1], + ["6twdw", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c468c4c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fb505dfa0eb3e2ca0325a9d5a0f36a4077eeb787", 1], + ["gsqxz", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c568c5c587", 1], + ["mrpue", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c568c5c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143bc61a327cb0a99af66276434112bdec93b13c3e87", 1], + ["ldy8s", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c66800c600c687", 1], + ["6my5d", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c66800c600c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c7f6c545c7fbe0e521a99fd2414f1d616f0a01687", 1], + ["3hy92", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c76800c700c787", 1], + ["5z4k5", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c76800c700c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144879033da25aedede3be2bacbe1b7da877fd042f87", 1], + ["e78pl", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c86800c800c887", 1], + ["f7mt8", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c86800c800c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91409fc037b8160b2add4528781119d28c259a4ed6287", 1], + ["x2wdc", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c96800c900c987", 1], + ["ajmc2", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c96800c900c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144997d5f6154f4247d270c1ca6bd10c1d0b6905d687", 1], + ["uduf8", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300ca6800ca00ca87", 1], + ["pzg7m", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300ca6800ca00ca87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e70d53d53ebbe279c00c6e9f5cf6451872604d687", 1], + ["qxn8m", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cb6800cb00cb87", 1], + ["2cakt", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cb6800cb00cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7d9d372f7d53761530cc6d60a923fdc2b4fd50f87", 1], + ["urj42", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cc6800cc00cc87", 1], + ["5drus", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cc6800cc00cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d36b18a86a63c10fbd478761af3bd396fd2f533b87", 1], + ["3emly", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cd6800cd00cd87", 1], + ["302t6", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cd6800cd00cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142ed955210967b8a4404cc0d583e7babefb7f27c987", 1], + ["8gajz", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (nonP2SH)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c0c08b879169", 1], + ["6qrjv", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (P2SH20)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c0c08b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b11c6e0c2629f1cbe853a37b7334e610d00735d187", 1], + ["330v3", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c1c1bc879169", 1], + ["r3wdg", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (P2SH20)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c1c1bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e2ba2745f5921de3adac41be6516ada6556358587", 1], + ["sl8fe", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (nonP2SH)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c2c28b879169", 1], + ["qedqk", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (P2SH20)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c2c28b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914db5fe9c95e4b14f8cfab965daec5db61ead4eaf687", 1], + ["k06h0", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c3c38b879169", 1], + ["8rlh9", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c3c38b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147417cae3f1e6718721b357981081a3184e33c91a87", 1], + ["va8j0", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c4c48b879169", 1], + ["58kul", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c4c48b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b53f666cf707f35b113edb8faa6dd0213d1ad1f87", 1], + ["xe5xs", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c5c58b879169", 1], + ["af9ne", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (P2SH20)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c5c58b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91490c1cd4cf4cf0f1c972ea094ea3d994921e7083587", 1], + ["scmsx", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c651c68b879169", 1], + ["et934", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c651c68b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914955b780dcde5d4b3d7aed566fba07e0bb3c5065c87", 1], + ["u4e5e", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c751c7bc879169", 1], + ["7ey96", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c751c7bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da445b913e3447b117a5452848695ce65c61d76987", 1], + ["t5m2t", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000002951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169", 1], + ["k5w7d", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b512951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91416800cbe8ddc320a441e2e11c0ba98741682dad087", 1], + ["z8rgw", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c951c98b879169", 1], + ["r056j", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c951c98b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cce2a3bf93e117c6787d1283a3d32386b6df2c8b87", 1], + ["y68ar", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800ca00cabc879169", 1], + ["7smqv", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800ca00cabc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91414637fba5aac0495da5b4a1249be1c950e27f4bc87", 1], + ["jg8pe", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851cb51cb8b879169", 1], + ["d8jsx", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851cb51cb8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91463c1f043dedba365b3d1f9b75c233a0ba01d90a787", 1], + ["entgm", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cc00cc8b879169", 1], + ["56e9w", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cc00cc8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91485e3a291f9d3bca9fef2670c0aff48285233a58787", 1], + ["0vzkx", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cd00cdbc879169", 1], + ["50yzt", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cd00cdbc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493b1221c4c54b8c14c4d57e7ba66b8025c29bcc587", 1], + ["ex3vn", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000002c08710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac"], + ["rgp33", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000040002c0870000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b438710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac"], + ["6lwsk", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 1], + ["q5jpu", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 1], + ["njett", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 1], + ["j3pwv", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (P2SH20)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 1], + ["sedjh", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (nonP2SH)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000152000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 2], + ["7fzh2", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (P2SH20)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045202c087000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 2], + ["zvwad", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (nonP2SH)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000090000000159000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 9], + ["k28an", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (P2SH20)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045902c087000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 9], + ["uc6pt", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c187", 1], + ["zttc4", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (P2SH20)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000602c18702c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b1182c31f4b3659924bc83505a2fb37667fda12387", 1], + ["lv70c", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005825588c187", 1], + ["039hr", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c05825588c18705825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148dbc087995eb473353236a1c0897a69aab5c48ce87", 1], + ["rtmne", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000876825888c188c187", 1], + ["4zlny", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120876825888c188c1870876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148640cbdd1c115e08f75d9082e58c4de400d1652887", 1], + ["hskmq", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825288abc187", 1], + ["j4509", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a02c18706825288abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148734854d785e3d6851ef94a0f362b94d4966540887", 1], + ["f6px7", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040388c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000068253ab88c187", 1], + ["fwehg", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0388c187068253ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475155507ce3aa062c54092f875a4ddc17e5980dc87", 1], + ["9vqdu", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825388abc187", 1], + ["5myl3", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03abc18706825388abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91455a363671564191ddf82d56bcebb6ed469eb382087", 1], + ["y2w24", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403c1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000088253ab88abc1ab87", 1], + ["slkdz", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d03c1ab87088253ab88abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914468383d12181a33b9eb17b48a3b4f7792c17bd7487", 1], + ["mfzua", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (nonP2SH)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03c1ab8706c188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000b8256ab88abc188abc1ab87", 1], + ["wjg6k", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (P2SH20)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001703c1ab8706c188abc1ab870b8256ab88abc188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914767d9af37e4c295a64c4c6551c275c9c4313d90587", 1], + ["5xege", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (nonP2SH)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000bc188abc188abc1ab88c187", 1], + ["ufg8x", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (P2SH20)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91481397bc5b66a96ab5aa8e23636ed478dee9a845687", 1], + ["346js", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004c0c7c188", 1], + ["nha5r", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (P2SH20)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104c0c7c188000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d13ea3d424daf33bc3d66e0987dd034ec1f96b5f87", 1], + ["0z8mh", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302a914000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000009c1a901877e7ec0c787", 1], + ["nxpe4", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (P2SH20)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d02a91409c1a901877e7ec0c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140e00addcc1b4ce2fb55d4de0189f0776842ce60a87", 1], + ["5kcwm", "Transaction inspection: OP_TXVERSION (version == 0) (nonP2SH)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["76sru", "Transaction inspection: OP_TXVERSION (version == 0) (P2SH20)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["22j8j", "Transaction inspection: OP_TXVERSION (version == 1) (nonP2SH)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["gvdq0", "Transaction inspection: OP_TXVERSION (version == 1) (P2SH20)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["4s00e", "Transaction inspection: OP_TXVERSION (version == 2) (nonP2SH)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["w4xtx", "Transaction inspection: OP_TXVERSION (version == 2) (P2SH20)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["j8uzj", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["sdqs6", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["274ra", "Transaction inspection: OP_TXVERSION (version == 3) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["mxsfm", "Transaction inspection: OP_TXVERSION (version == 3) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["a7ywg", "Transaction inspection: OP_TXVERSION (version == 123456) (nonP2SH)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040340e201000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["fp07h", "Transaction inspection: OP_TXVERSION (version == 123456) (P2SH20)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070340e20102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["hfwul", "Transaction inspection: OP_TXVERSION (version == 4294967294) (nonP2SH)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["csz4l", "Transaction inspection: OP_TXVERSION (version == 4294967294) (P2SH20)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["dyax6", "Transaction inspection: OP_TXVERSION (version == 4294967295) (nonP2SH)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["prrm7", "Transaction inspection: OP_TXVERSION (version == 4294967295) (P2SH20)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["akydk", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (nonP2SH)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 1], + ["tgdk8", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (P2SH20)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 1], + ["lnw7q", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 1], + ["prjxm", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 1], + ["fwh5z", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (nonP2SH)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003951373130302d627974652074782073697a65206d696e696d756d20313233343536373839303132333435363738393031323334353637383930000000000100000000000000000a6a08766d625f7465737400000000", "0110270000000000000375c387"], + ["yava7", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (P2SH20)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003d51373130302d627974652074782073697a65206d696e696d756d203132333435363738393031323334353637383930313233343536373839300375c387000000000100000000000000000a6a08766d625f7465737400000000", "01102700000000000017a914410488baf72ce08518ed6da0fda16f91b1907f8487"], + ["49y82", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (nonP2SH)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000153000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 2], + ["2exhq", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (P2SH20)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045302c387000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 2], + ["hxyj3", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (nonP2SH)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 9], + ["tzw7t", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (P2SH20)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045a02c387000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 9], + [ + "dr4g8", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (nonP2SH)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "02000000650000000000000000000000000000000000000000000000000000000000000000000000000201650000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + [ + "gk0x7", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (P2SH20)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "020000006500000000000000000000000000000000000000000000000000000000000000000000000005016502c3870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["9vegm", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["ajcr7", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["pysvy", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (nonP2SH)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["2hcnx", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (P2SH20)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c487000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["a6s0u", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (nonP2SH)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["qmaks", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (P2SH20)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c487000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["5953j", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (nonP2SH)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020114000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["v380g", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (P2SH20)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005011402c487000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["al69w", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (nonP2SH)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020164000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["jyvyq", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (P2SH20)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005016402c487000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["dekhm", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (nonP2SH)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["wg5ru", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (P2SH20)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["949mh", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["usfq9", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["p3fed", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["hskrl", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["60fqf", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (nonP2SH)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["xhmrq", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (P2SH20)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c587000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["2cjpp", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (nonP2SH)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000504ff64cd1d000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["thcne", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (P2SH20)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000804ff64cd1d02c587000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["62v09", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (nonP2SH)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005040065cd1d000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["nantk", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (P2SH20)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008040065cd1d02c587000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["c59cv", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (nonP2SH)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["msua4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (P2SH20)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c587000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["wt8a4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (nonP2SH)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["snd48", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (P2SH20)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c587000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["apasg", "Transaction inspection: OP_UTXOVALUE (10000) (nonP2SH)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + ["34j34", "Transaction inspection: OP_UTXOVALUE (10000) (P2SH20)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + ["z4ygy", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (nonP2SH)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402112700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + ["lgyyx", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (P2SH20)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070211270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + ["y63fa", "Transaction inspection: OP_UTXOVALUE (ignore result) (nonP2SH)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c675", 1], + ["6w9l3", "Transaction inspection: OP_UTXOVALUE (ignore result) (P2SH20)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436e9c1e392c4a754ccf9e2521e46d63af0b5bb2587", 1], + ["j5h3j", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (nonP2SH)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c675", 1], + ["5gx2e", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (P2SH20)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ac9e62b390b0ca55959ba30d121a50fc62472b187", 1], + ["hxtst", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (nonP2SH)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc675", 1], + ["05pdg", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (P2SH20)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91418edf008814b787b1ad6ce2609acf3cde52c7c1e87", 1], + ["hvapj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c675", 1], + ["t26yj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914420bf68700082813d30ab118efb905bfd182456d87", 1], + ["3wlp4", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (nonP2SH)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c675", 1], + ["5gaqe", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (P2SH20)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143a4c2f5e4735fc878b1bbd5b5954f514d5c8be8887", 1], + ["dlaxg", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (nonP2SH)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102751000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + ["ucme6", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (P2SH20)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210275102c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + [ + "yedea", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (nonP2SH)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000060340e20101640000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c68740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + [ + "lpa37", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (P2SH20)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000090340e201016402c6870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a914d497ca2f5c238fc820a85a9230c26815ebb851918740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["wspfd", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000060415cd5b070000000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000002c687"], + ["nu68c", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000090415cd5b070002c68700000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["e2mjt", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "020000000100000000000000000000000000000000000000000000000000000000000000000000000009070040075af0750700000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070002c687"], + ["lnseh", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000c070040075af075070002c687000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["uh9nd", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000a08ffffffffffffff7f00000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f02c687"], + ["7gyvw", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000d08ffffffffffffff7f0002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f17a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["9crn2", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000b0900000000000000800000000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008002c687"], + ["j7l4x", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000e090000000000000080000002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["j33pn", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (nonP2SH)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", 1], + ["ezfrr", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (P2SH20)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080351c7870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", 1], + ["e5r7z", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (nonP2SH)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001817a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", 1], + ["jqj53", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (P2SH20)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c17a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", 1], + ["fgxup", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (nonP2SH)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c787", 1], + ["2uchy", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (P2SH20)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac0300c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148756772161ff4b37f5047eb8fec993a67bb25cbf87", 1], + ["7wqmv", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c775", 1], + ["6ml7d", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ad47e0f844f6bbc33df425e13d639da1be47320487", 1], + ["08c02", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c775", 1], + ["r6tsz", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a92cca806d7cd3f2219d30b8827879c35483cc1387", 1], + ["h5zg4", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc775", 1], + ["ud8dm", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c48a1a82842311c3d918d603c81e2d78f8c838f287", 1], + ["s99rk", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c775", 1], + ["hu2xq", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ca62f6db097fa158803514b761256aade895efc87", 1], + ["n6fk2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c775", 1], + ["580u2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a42e9d731b888b654730a3f2ad520559cd1063b487", 1], + ["aq6sp", "Transaction inspection: OP_UTXOBYTECODE (maximum size UTXO bytecode) (nonP2SH)", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787", 1], + ["ezh0a", "Transaction inspection: OP_UTXOBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c775", 1], + ["wh04c", "Transaction inspection: OP_UTXOBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd09024d0202000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00017551c775", 1], + ["790ux", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (nonP2SH)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000380402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001900c78851abc78852c78853c7ab8857c7885dc788ab012ac78710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187"], + ["njcfy", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (P2SH20)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000520402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a4f3c4e1e03734f5e4f73f136152b28f2957cbc18710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187"], + ["t5nr8", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (nonP2SH)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000006017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000000f00c788ab51c788ab52c788ab53c787102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["926rx", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (P2SH20)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000007017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870f00c788ab51c788ab52c788ab53c7870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a9143c791e34d5366304e5474eb19abb41541331423187102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["4vuv4", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c887", 1], + ["rgrps", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000300c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442357ab9beeb0809abf286d2ecbbd047709f4ff887", 1], + ["nnh8r", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", 1], + ["p9ukh", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", 1], + ["8hky8", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000001000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", 1], + ["lplef", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000010351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", 1], + ["79z0d", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000000100000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["hk7nq", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000252000000000000000000000000000000000000000000000000000000000000000010351c88700000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["tzw9j", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c875", 1], + ["xpk79", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142852124534d57bd929d21b449e610ee22fe8746487", 1], + ["kd3jc", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c875", 1], + ["yutz9", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ff238384415a79cdc5115d0469e3fe1f8153b45e87", 1], + ["e27rx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c875", 1], + ["kgqpx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914523e07ae6a2269faca32b65b14acd07ccbda0e5e87", 1], + ["qy39t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc875", 1], + ["nwg49", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140ad568a49f50fb90af00472519b23ff584cb7ed087", 1], + ["rnf4n", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c875", 1], + ["mwv2r", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787", 1], + ["p8e6t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c875102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["j9xf0", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c8750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["3ss4h", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d5300000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f7587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["zmwmj", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000022012a5d531d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f758700000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a91421c219da675eae84da66fa2f4b9f70bff74b73fd87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["c8x8a", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (nonP2SH)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c987", 1], + ["jj689", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (P2SH20)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914150150967a345cee132e10ed63ee8b2e2127183387", 1], + ["43nsl", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", 1], + ["annu3", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", 1], + ["0852u", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (nonP2SH)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", 1], + ["wrqea", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (P2SH20)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", 1], + ["arjyx", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["sm9kp", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351c98700000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["ecauy", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c975", 1], + ["qmew2", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144e84cbaea6f9b66166ea14eea76df537192c4cbd87", 1], + ["9cgnu", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c975", 1], + ["2ljft", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4726b6ab589e3bf19ac1628d97db9a9bc77517487", 1], + ["ael35", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c975", 1], + ["drlfk", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453c8a5a4de090d9a337c7db83f2c443a9605d8c387", 1], + ["uugrq", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc975", 1], + ["yw80j", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145e9af27552de9ba7a9bea88b5aa0ff55bf6e3e8387", 1], + ["4djj0", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c975", 1], + ["f34c4", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ef1c56fca391fa18de57061d8184c057335523087", 1], + ["44xf8", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c975102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["yv2hj", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c9750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a9141ef1c56fca391fa18de57061d8184c057335523087102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["0ma3s", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300c9008851c951c98853c9885dc988012ac987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["rtkyc", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300c9008851c951c98853c9885dc988012ac9870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a852b37c118384a3655d0a3c92af3bfa806466c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["p3v45", "Transaction inspection: OP_INPUTBYTECODE (input 0) (nonP2SH)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000068ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587", 1], + ["vyy3e", "Transaction inspection: OP_INPUTBYTECODE (input 0) (P2SH20)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000006b004c68ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450d51b25a7868fe6adf200440c53d0e0e6be9eb987", 1], + ["sdgfd", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004ca015187", 1], + ["0xhy0", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (P2SH20)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104ca015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144518d7d2d7c5e959b74d272957abb3a4e22f511787", 1], + ["prtnj", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (nonP2SH)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000351ab51000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000769ca0351ab5187", 1], + ["5yxye", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (P2SH20)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b51ab510769ca0351ab5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d2742d27a3ea54a2fefae6733492b5258cd87cbd87", 1], + ["8wnzm", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (nonP2SH)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000d76827c7eab77767eab51ca8851", 1], + ["d5ul4", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (P2SH20)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c0d76827c7eab77767eab51ca88510d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fd6a26edcde4ccca609c63dc5c6d7005cb725cb387", 1], + ["2wrww", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017ca527faba902a9147c7e01877eab51c788517f75015187", 1], + ["cz7ah", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (P2SH20)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000195117ca527faba902a9147c7e01877eab51c788517f75015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146e426e71ad390256f8e7a2dd7b88b139bf73eb6e87", 1], + ["47zzy", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003ca5187", 1], + ["rwe6p", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (P2SH20)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000055103ca5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fdfd3039b9c13e2268314e703118bf57a227a16b87", 1], + ["x7n7u", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300ca75", 1], + ["zp9gc", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b42626d4d54774b8be5bf423dbd422e21851914887", 1], + ["9gg2c", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351ca75", 1], + ["9maeh", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91429a5bf683d386c8f65dc5ccb8f22766fec8e787387", 1], + ["847mu", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100ca75", 1], + ["c9vma", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5b73676cda7241ca379713603db7ca1f3e0ea0c87", 1], + ["33hhj", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fca75", 1], + ["rs7er", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a20ef8fa3dc1d87aa73ee6e2ddd706a23e8e5de87", 1], + ["ts7nd", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352ca75", 1], + ["f89ml", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914266206a75755c70c126f777448e6a410391d637687", 1], + ["dlnwf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352ca75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["r93tx", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352ca750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a914266206a75755c70c126f777448e6a410391d637687102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["x4vrl", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (nonP2SH)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000240802002a0402002a870802000d0402000d870802000704020007870802000104020001870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001200ca00ca8851ca8857ca885dca88012aca87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["akjnr", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (P2SH20)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000370802002a0402002a870802000d0402000d870802000704020007870802000104020001871200ca00ca8851ca8857ca885dca88012aca870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914430f061cc80ff742b57e328bc3401c1a210e5d7b87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["j2z86", "Transaction inspection: OP_INPUTBYTECODE (maximum size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd0f024d08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030451ca8777", 1], + ["lsjpv", "Transaction inspection: OP_INPUTBYTECODE (excessive size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd10024d09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040551ca8777", 1], + ["dtx7r", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0302514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", 1], + ["3fuxn", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0802514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", 1], + ["s23zf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0a02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", 1], + ["v0689", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", 1], + ["ne0zn", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (nonP2SH)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb87", 1], + ["ysc4e", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (P2SH20)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387", 1], + ["l46dz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (nonP2SH)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", 1], + ["sgtuu", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (P2SH20)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", 1], + ["wsnyq", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", 1], + ["zku65", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", 1], + ["mnn9j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["9l0lg", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["32g8j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000300cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["z0e7y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000300cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["flpv2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff00feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["2hpht", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17500cb87feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["80zyt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["xwd6l", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17500cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["8pgnz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["nu30y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["ljmun", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["n9jyd", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["x6sc5", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["uyrhw", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["xuj8t", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb75", 1], + ["gtfha", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bdaf8ccc75208c9d548c1690337db42ae19a036487", 1], + ["ej6ln", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb75", 1], + ["a0s38", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914498874323743a9d189a4cea2e0f31ae18677376487", 1], + ["fc7sf", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100cb75", 1], + ["qpnt2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7b7c219eda22932c71ff387ecf8b5fbe0276bad87", 1], + ["khjgz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcb75", 1], + ["n2cms", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144d11fe0414239057aa155fe2ec9fbb766c7d6e3c87", 1], + ["05f3k", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cb75", 1], + ["m9zlt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887", 1], + ["lfxk6", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352cb75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["gq4nl", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352cb750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["su5t7", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300cb008851cb51cb8853cb885dcb88012acb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["rc9d3", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300cb008851cb51cb8853cb885dcb88012acb870000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914d4d1ce02ebaab2d5f8cda5c0acd1d89656596b4187102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["9dfdk", "Transaction inspection: OP_OUTPUTVALUE (output 0) (nonP2SH)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["6tm5y", "Transaction inspection: OP_OUTPUTVALUE (output 0) (P2SH20)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["jtuew", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["6terc", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["n2dmk", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d61a9c8e40887e2bd241707d1ddb6e2730e4e87aeca1e9a5175b4a2042ed36c73beb5c9bee7c2b95e8856a3b31dd3e5ab55c0262eadd942a996859a5fd426076c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000110270000000000000300cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["r8w8x", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441220ce6fcca0aeef27e808bb730d1c3c371f06298e79fd0948911795308c9e0916f405ce7c8465c4a6c0969a95bc1d45c35d44ef834ca733b0ea50052fb8c2796c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc870000000001102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b6488700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["0a403", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc75", 1], + ["wy0q9", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145a1dede50254d70a00eec28c70029401bf888efa87", 1], + ["t237p", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cc75", 1], + ["7auug", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e5cafd4ef09b908959aa8c4bbe12b2cba38f4be787", 1], + ["ec2zv", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (nonP2SH)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411cc4abed5d58f1236ae7b462b587d0db9af0a83e2867c6d065db42e7ea5d440a81383d29c05764bf4d2ba55f67cf245825b4aaa3b43eb1b5d4c68e9257c75abac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcc751127000000000000034fcc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcc75", 1], + ["8g609", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (P2SH20)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e60ec935181e309b69033f80e6e8ef4954c47b5193628500c4852faa94e6336dfe0463d5a07bd2a10f4f20c74c02b4fad477441e367b1dff5be81b84cbf97225c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcc750000000002102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487112700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de348700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487", 1], + ["7kz9t", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cc7511270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", 1], + ["s3kn5", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000002102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", 1], + ["35z4f", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cc7511270000000000000352cc7512270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", 1], + ["xjk3x", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000003102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587122700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", 1], + ["v7rla", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (nonP2SH)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441337957e0102253ea781600e6016bdc119f57a88e9da12413354d6b2c105fadc65a7a5708515991b2cc66a020df73f6f27f8b3789e4ad5494d18ac32e552267acc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c023a27021d27021727021127000000003210270000000000001200cc00cc8851cc8857cc885dcc88012acc8711270000000000001200cc00cc8851cc8857cc885dcc88012acc8712270000000000001200cc00cc8851cc8857cc885dcc88012acc8713270000000000001200cc00cc8851cc8857cc885dcc88012acc8714270000000000001200cc00cc8851cc8857cc885dcc88012acc8715270000000000001200cc00cc8851cc8857cc885dcc88012acc8716270000000000001200cc00cc8851cc8857cc885dcc88012acc8717270000000000001200cc00cc8851cc8857cc885dcc88012acc8718270000000000001200cc00cc8851cc8857cc885dcc88012acc8719270000000000001200cc00cc8851cc8857cc885dcc88012acc871a270000000000001200cc00cc8851cc8857cc885dcc88012acc871b270000000000001200cc00cc8851cc8857cc885dcc88012acc871c270000000000001200cc00cc8851cc8857cc885dcc88012acc871d270000000000001200cc00cc8851cc8857cc885dcc88012acc871e270000000000001200cc00cc8851cc8857cc885dcc88012acc871f270000000000001200cc00cc8851cc8857cc885dcc88012acc8720270000000000001200cc00cc8851cc8857cc885dcc88012acc8721270000000000001200cc00cc8851cc8857cc885dcc88012acc8722270000000000001200cc00cc8851cc8857cc885dcc88012acc8723270000000000001200cc00cc8851cc8857cc885dcc88012acc8724270000000000001200cc00cc8851cc8857cc885dcc88012acc8725270000000000001200cc00cc8851cc8857cc885dcc88012acc8726270000000000001200cc00cc8851cc8857cc885dcc88012acc8727270000000000001200cc00cc8851cc8857cc885dcc88012acc8728270000000000001200cc00cc8851cc8857cc885dcc88012acc8729270000000000001200cc00cc8851cc8857cc885dcc88012acc872a270000000000001200cc00cc8851cc8857cc885dcc88012acc872b270000000000001200cc00cc8851cc8857cc885dcc88012acc872c270000000000001200cc00cc8851cc8857cc885dcc88012acc872d270000000000001200cc00cc8851cc8857cc885dcc88012acc872e270000000000001200cc00cc8851cc8857cc885dcc88012acc872f270000000000001200cc00cc8851cc8857cc885dcc88012acc8730270000000000001200cc00cc8851cc8857cc885dcc88012acc8731270000000000001200cc00cc8851cc8857cc885dcc88012acc8732270000000000001200cc00cc8851cc8857cc885dcc88012acc8733270000000000001200cc00cc8851cc8857cc885dcc88012acc8734270000000000001200cc00cc8851cc8857cc885dcc88012acc8735270000000000001200cc00cc8851cc8857cc885dcc88012acc8736270000000000001200cc00cc8851cc8857cc885dcc88012acc8737270000000000001200cc00cc8851cc8857cc885dcc88012acc8738270000000000001200cc00cc8851cc8857cc885dcc88012acc8739270000000000001200cc00cc8851cc8857cc885dcc88012acc873a270000000000001200cc00cc8851cc8857cc885dcc88012acc873b270000000000001200cc00cc8851cc8857cc885dcc88012acc873c270000000000001200cc00cc8851cc8857cc885dcc88012acc873d270000000000001200cc00cc8851cc8857cc885dcc88012acc873e270000000000001200cc00cc8851cc8857cc885dcc88012acc873f270000000000001200cc00cc8851cc8857cc885dcc88012acc8740270000000000001200cc00cc8851cc8857cc885dcc88012acc8741270000000000001200cc00cc8851cc8857cc885dcc88012acc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cc00cc8851cc8857cc885dcc88012acc87", 1], + ["jjmth", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (P2SH20)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441376a3c3cf7345e31982bf5b85792d3b3da802d2c704b8d0b6244e6255b42a5a7895a605ce24ff626f0fcd02daa3ed451de70eb12f84ddc7d792a6442af7f435bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f023a27021d270217270211271200cc00cc8851cc8857cc885dcc88012acc870000000032102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87112700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87122700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87132700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87142700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87152700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87162700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87172700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87182700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87192700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87202700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87212700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87222700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87232700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87242700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87252700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87262700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87272700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87282700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87292700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87302700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87312700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87322700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87332700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87342700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87352700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87362700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87372700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87382700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87392700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87402700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87412700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87", 1], + ["d3e4s", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411914d1d16f673884038b449f7090a0d3c657148c3fd3cc190d2290a4d65884d9432c0a3dd67c6d57fabe62ec832e90697971e0f38ba8d1c88ca00908c21d3f2dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060415cd5b0700000000000115cd5b070000000002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["hfsgn", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441aa25ded491ef8724bcd372e0900d0a5ef3855495862b443948252c35e05b9a5c97b64f749f7c5dad84d0a4f1edb560da8bc147b003acff0f7117186fe6116050c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090415cd5b070002cc87000000000115cd5b070000000017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["6r2qt", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d098cb4d916b27db8b87cd5f3c3d2217db455c3da3b43b81e45fde35783c44e4a2d100175c6a77d21e3ac5e5ccc1b5aff22ae3d5b0474b464b84c1bebe972b57c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009070040075af075070000000000010040075af075070002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["3fp95", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441fcf93fb29e1777a54a66cb1b8282b693c70e857f520b1406a05072cd79c04fbb698bd4c81b112e1ebed63743aaaadb1fccc85f8ca6bc492c6c68afff34b365c5c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c070040075af075070002cc8700000000010040075af075070017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["8jy9k", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441da662ce444d3cd6a30cb9dd4692ba617e5d81dfb784076e4ae07662bfe71db735a2a3224a0b2f83130c289e2361eeb325e94236b605b27bf75b9aded47559e8bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a08ffffffffffffff7f000000000001ffffffffffffff7f02cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["phwq6", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e2d18cd10452d690465bc66f516fc721f3f427c8855b8e735645d50a28c3c6e4efe07f81e2dc97ce535b6f09015e8057b0ebd780e196ea91dcc75154acd5b504c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d08ffffffffffffff7f0002cc870000000001ffffffffffffff7f17a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["qy9xt", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644120d73f4435c2901df73c8fb5e7ea68a9548aceb72f34c37a3dd4ba4870c04e562cb934056d2a8faeef6609dd47ebcc678430607f3f1e873fdf059e8bd069e888c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b09000000000000008000000000000001000000000000008002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["cra58", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644154d8a3508ce703e59cff49ccf62e2321c8e90337db623028ba2399368ffbad7c98a2c39a5e27a72d3ddf80c080c1e50661d5ee3b2a97361857ea80b132c424bbc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e090000000000000080000002cc870000000001000000000000008017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["efhhm", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a6a08766d625f74657374000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["d2ve9", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0a6a08766d625f746573740300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["sj69g", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["4zqq3", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["dkajw", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a00000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["3wjnv", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd8700000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["5flt6", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (nonP2SH)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040375ab51000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000400abcd87", 1], + ["5msmp", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (P2SH20)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090375ab510400abcd87000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ddb90ed315acb3ebe30542f597c8fe1d9dec8c2287", 1], + ["vqx55", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["jk2p8", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1], + ["myk99", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cd75", 1], + ["x9306", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0667ad0678c5ac9189d611b7feb1ba9857040eb87", 1], + ["mkmyw", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (nonP2SH)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064415d67fee69ca11c78082eea7c40b227af8c93a65d05d77778723ddd324419a8fc82317672e98f8d2718e619f090c7c824c5678088792155426f6f48f5611e3bddc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcd751127000000000000034fcd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcd75", 1], + ["fshgr", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (P2SH20)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644108e647f5721201530190228be5b6c5d66d259a1b451c18e0070b90dc73233a7a37108c1cb8a3723400278d0f79677929f8e18e44f24b89d86175b7b1c69bf912c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcd750000000002102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887112700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d788700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887", 1], + ["44p7j", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cd7511270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", 1], + ["xvtvk", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000002102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", 1], + ["pw0vv", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cd7511270000000000000352cd7512270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", 1], + ["5rg92", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000003102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787122700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", 1], + ["9dcw7", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (nonP2SH)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d036a012a026a5d026a57026a5100000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cd00cd8851cd8857cd885dcd88012acd87", 1], + ["v0pn5", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (P2SH20)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000020036a012a026a5d026a57026a511200cd00cd8851cd8857cd885dcd88012acd8700000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91497ab1496d1f9599b44ebfaa166acc0852f35524387", 1], + ["h4ml9", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["yvnt8", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030300cd8700000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["6nju2", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0c024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["36d8k", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd10024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040300cd8700000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["y8zh2", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["j4axz", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1], + ["qkz9v", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["vf3j5", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_standard.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_standard.json new file mode 100644 index 00000000..7e98426a --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_standard.json @@ -0,0 +1,101 @@ +[ + ["kqlqv", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (P2SH20)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000482008777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91498e86c508e780cfb822bba3d5ab9b3e30450196b87", 1], + ["f6790", "Basic push operations: OP_PUSHBYTES_1 (P2SH20)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000701000482518777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914774415af6b71a5e4aafebe27271713238faef29b87", 1], + ["642k0", "Basic push operations: OP_PUSHBYTES_2 (P2SH20)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080200000482528777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac980e4b702ffa3f36d97d0a0150b20fca324cfd87", 1], + ["wp57c", "Basic push operations: OP_PUSHBYTES_3 (P2SH20)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009030000000482538777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bc84dc62228d6b7c1b5fda70ef20aa281642c25087", 1], + ["rhufv", "Basic push operations: OP_PUSHBYTES_4 (P2SH20)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a04000000000482548777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914520f81159716d7d4fdba01c9a499d719a1b109a487", 1], + ["sydt9", "Basic push operations: OP_PUSHBYTES_5 (P2SH20)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0500000000000482558777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f47df2fd6b5300617883d49f98e06fdc83e938f887", 1], + ["yszmd", "Basic push operations: OP_PUSHBYTES_6 (P2SH20)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c060000000000000482568777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91427d3e4ba6d657a2802adb4605d6f1b22d8ab03a987", 1], + ["cp088", "Basic push operations: OP_PUSHBYTES_7 (P2SH20)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d07000000000000000482578777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acb9845c4d630864bf618f55594a21f70598546c87", 1], + ["5xy5w", "Basic push operations: OP_PUSHBYTES_8 (P2SH20)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0800000000000000000482588777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143187995004a81a0c40c8aee658b94bc067b8c41987", 1], + ["sgxp5", "Basic push operations: OP_PUSHBYTES_9 (P2SH20)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f090000000000000000000482598777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914051c402d952b9383195a9684874309515ab42d5087", 1], + ["f6rhr", "Basic push operations: OP_PUSHBYTES_10 (P2SH20)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100a0000000000000000000004825a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fcfebf7f52d455ece34b52d922eeffe789b4b2f87", 1], + ["lqg4v", "Basic push operations: OP_PUSHBYTES_11 (P2SH20)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000110b000000000000000000000004825b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e6a58ca1780653073a7715e6bef9570a42fff99287", 1], + ["pzrxc", "Basic push operations: OP_PUSHBYTES_12 (P2SH20)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120c00000000000000000000000004825c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148d3d79625e4f5cc9474d2056fb514dabdbf2853e87", 1], + ["ym5tw", "Basic push operations: OP_PUSHBYTES_13 (P2SH20)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000130d0000000000000000000000000004825d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cba13f4df2f3c799be0fda2fda348563fcf3bffc87", 1], + ["4hd9u", "Basic push operations: OP_PUSHBYTES_14 (P2SH20)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000140e000000000000000000000000000004825e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914222ec246a4c5c463d2a2e9f3716d7a858d8b37c687", 1], + ["j5rjr", "Basic push operations: OP_PUSHBYTES_15 (P2SH20)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000150f00000000000000000000000000000004825f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aaf70e5c15367a5802d82aa514f5432e08c583987", 1], + ["6ljf5", "Basic push operations: OP_PUSHBYTES_16 (P2SH20)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001610000000000000000000000000000000000482608777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914264720413b68ba6ce2cb2f8c7c92ec828a82f3bc87", 1], + ["dl6f8", "Basic push operations: OP_PUSHBYTES_17 (P2SH20)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018110000000000000000000000000000000000058201118777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc71efd38361fd302b320bb7fb0fda918033095687", 1], + ["k39kg", "Basic push operations: OP_PUSHBYTES_18 (P2SH20)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001912000000000000000000000000000000000000058201128777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dca36876dafe5650db8bab999fd2088b937804587", 1], + ["nvau6", "Basic push operations: OP_PUSHBYTES_19 (P2SH20)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1300000000000000000000000000000000000000058201138777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d4b5556e2b7ba6ce35bf5654bea3e9e4b98d269587", 1], + ["3e553", "Basic push operations: OP_PUSHBYTES_20 (P2SH20)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b140000000000000000000000000000000000000000058201148777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b98ce584b9ce151836da251897518e90825bbea587", 1], + ["u45d9", "Basic push operations: OP_PUSHBYTES_21 (P2SH20)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c15000000000000000000000000000000000000000000058201158777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149c6450943963d8e9a47d8167391186d31f3ff91d87", 1], + ["cx7gd", "Basic push operations: OP_PUSHBYTES_22 (P2SH20)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1600000000000000000000000000000000000000000000058201168777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451edea7c56cb0626bd8d999ba0e6f9cee64f273387", 1], + ["f676p", "Basic push operations: OP_PUSHBYTES_23 (P2SH20)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e170000000000000000000000000000000000000000000000058201178777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145d95fee0a25523164be8b007d6e482256358070887", 1], + ["cw9dh", "Basic push operations: OP_PUSHBYTES_24 (P2SH20)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f18000000000000000000000000000000000000000000000000058201188777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91495e25cc3889575b41fdf42f61f34b94a2c7d181d87", 1], + ["jy0ze", "Basic push operations: OP_PUSHBYTES_25 (P2SH20)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201900000000000000000000000000000000000000000000000000058201198777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914221ed86a048b577912b56d6a03474332cb8e8b2087", 1], + ["q7ryt", "Basic push operations: OP_PUSHBYTES_26 (P2SH20)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000211a00000000000000000000000000000000000000000000000000000582011a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143337f7e1930e5ca79030cf337703f9566339a91887", 1], + ["w7hj2", "Basic push operations: OP_PUSHBYTES_27 (P2SH20)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000221b0000000000000000000000000000000000000000000000000000000582011b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91487ad0ed1b3849a5741ceac834d6a3d0826972fcb87", 1], + ["6afry", "Basic push operations: OP_PUSHBYTES_28 (P2SH20)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000231c000000000000000000000000000000000000000000000000000000000582011c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c64ef31fb53d0c33398bbc61b3b3d56edf3e596487", 1], + ["khjzs", "Basic push operations: OP_PUSHBYTES_29 (P2SH20)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000241d00000000000000000000000000000000000000000000000000000000000582011d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146df2fe5bdd6777f28518e32087bfe8bbc04cf0dc87", 1], + ["ncfyd", "Basic push operations: OP_PUSHBYTES_30 (P2SH20)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000251e0000000000000000000000000000000000000000000000000000000000000582011e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91408afde6a1b5b1ba056871d80d469c7f441e90efd87", 1], + ["rcm0n", "Basic push operations: OP_PUSHBYTES_31 (P2SH20)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000261f000000000000000000000000000000000000000000000000000000000000000582011f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dad77efc6ca13ba74f97d3513152ead6b56f59a87", 1], + ["gwa65", "Basic push operations: OP_PUSHBYTES_32 (P2SH20)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027200000000000000000000000000000000000000000000000000000000000000000058201208777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406f3e1df460e90acc01f6b5c02106e91667165bf87", 1], + ["lf8vg", "Basic push operations: OP_PUSHBYTES_33 (P2SH20)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002821000000000000000000000000000000000000000000000000000000000000000000058201218777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7499543f52b711cb5ef3c0ba36b4c6dc621083487", 1], + ["3hycv", "Basic push operations: OP_PUSHBYTES_34 (P2SH20)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292200000000000000000000000000000000000000000000000000000000000000000000058201228777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aeeacc939e76be0859bd4d1203877f11de5535e87", 1], + ["djdke", "Basic push operations: OP_PUSHBYTES_35 (P2SH20)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a230000000000000000000000000000000000000000000000000000000000000000000000058201238777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f868100124fa1ebfd00b040dd73f5bc3cb2a55087", 1], + ["p2gl3", "Basic push operations: OP_PUSHBYTES_36 (P2SH20)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b24000000000000000000000000000000000000000000000000000000000000000000000000058201248777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c830e4841b4c717566a6b2f35abad13eb4b223087", 1], + ["d4ncp", "Basic push operations: OP_PUSHBYTES_37 (P2SH20)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2500000000000000000000000000000000000000000000000000000000000000000000000000058201258777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c2b2e1e363ecafb5b3df03f0a7b5d15d51a9965687", 1], + ["mmkjk", "Basic push operations: OP_PUSHBYTES_38 (P2SH20)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d260000000000000000000000000000000000000000000000000000000000000000000000000000058201268777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ce3288a4a81ea394c8bad2ad35271d82f8a115a87", 1], + ["ampe2", "Basic push operations: OP_PUSHBYTES_39 (P2SH20)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e27000000000000000000000000000000000000000000000000000000000000000000000000000000058201278777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91466b50d17451438b34f216a14b2f27efc72998f3887", 1], + ["ahnxk", "Basic push operations: OP_PUSHBYTES_40 (P2SH20)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2800000000000000000000000000000000000000000000000000000000000000000000000000000000058201288777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7ed79eb8b3f886bd65968d05b950dc539c4325587", 1], + ["2ewj3", "Basic push operations: OP_PUSHBYTES_41 (P2SH20)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000030290000000000000000000000000000000000000000000000000000000000000000000000000000000000058201298777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91426c2d85bb90707c2e985be6f8be682d327bb4a2b87", 1], + ["mu75l", "Basic push operations: OP_PUSHBYTES_42 (P2SH20)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000312a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148f9872f9130fe0a1baae088d4a5d47d37ac6a5c687", 1], + ["7pjdc", "Basic push operations: OP_PUSHBYTES_43 (P2SH20)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000322b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7d4cac3da175eebc585e4274bf3a76d3096a37e87", 1], + ["jpk5z", "Basic push operations: OP_PUSHBYTES_44 (P2SH20)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000332c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a8a8d7455806683a568f2362182ceec0641b40b987", 1], + ["tgpk4", "Basic push operations: OP_PUSHBYTES_45 (P2SH20)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000342d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91432ea958fd4cc9a322cb80ce5856334c457454ba887", 1], + ["8vyze", "Basic push operations: OP_PUSHBYTES_46 (P2SH20)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000352e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914de37f1ef90eb550c3b3d996eb7016a73eed6852f87", 1], + ["cy7a8", "Basic push operations: OP_PUSHBYTES_47 (P2SH20)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000362f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3758cb9ba5090b6b32c2552ee51c04b398eba1c87", 1], + ["qsc6d", "Basic push operations: OP_PUSHBYTES_48 (P2SH20)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201308777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914155b3d04f9e00ebb9fc1a30e0661cde97c2abd1787", 1], + ["mqv2w", "Basic push operations: OP_PUSHBYTES_49 (P2SH20)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201318777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428c049cbccaf76ccc3a02b402e91affbd646948c87", 1], + ["hfd6e", "Basic push operations: OP_PUSHBYTES_50 (P2SH20)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201328777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e320b3d5b862f9f6a8de45829cb07a8984e971c87", 1], + ["9slcu", "Basic push operations: OP_PUSHBYTES_51 (P2SH20)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201338777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d0cb6e4f6a1f7c8095692d22ef3b0cd0295696b087", 1], + ["r7zmd", "Basic push operations: OP_PUSHBYTES_52 (P2SH20)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201348777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447c59d45ad8efaed1dfd7048511310bbdacb89e887", 1], + ["2u4xy", "Basic push operations: OP_PUSHBYTES_53 (P2SH20)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201358777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914710f50b3b6aa9a6f4d972f4782636f2cf77013be87", 1], + ["2wqdz", "Basic push operations: OP_PUSHBYTES_54 (P2SH20)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201368777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6448f6bc26a215cf56e0f902f88b7954661f24c87", 1], + ["c8kcl", "Basic push operations: OP_PUSHBYTES_55 (P2SH20)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201378777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd9e0c67301010cb39ea26e0e77745a764a472be87", 1], + ["fh5t0", "Basic push operations: OP_PUSHBYTES_56 (P2SH20)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201388777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142c05abd339742b3484ddcfefa6467fb69be20e8c87", 1], + ["d6xk3", "Basic push operations: OP_PUSHBYTES_57 (P2SH20)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201398777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406336beb02d2b38bf56a0924cefb269e9295165987", 1], + ["88dq6", "Basic push operations: OP_PUSHBYTES_58 (P2SH20)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000413a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b4856711b25d23528c6afacedf0e46d27d5188b387", 1], + ["zn0ld", "Basic push operations: OP_PUSHBYTES_59 (P2SH20)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000423b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc9deee182ff2c2a9cffe25d8dfe6ce6bf4eabe187", 1], + ["3fgnc", "Basic push operations: OP_PUSHBYTES_60 (P2SH20)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000433c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cfe57fdc4d23d94a5e72f6e034aba262bd7b864a87", 1], + ["98ch8", "Basic push operations: OP_PUSHBYTES_61 (P2SH20)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000443d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914134265a6356aead5389df701300d2772933c258587", 1], + ["0dj2s", "Basic push operations: OP_PUSHBYTES_62 (P2SH20)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000453e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f951edfc4b17e8b0f3bba38b34ff8a559d366f487", 1], + ["klxmx", "Basic push operations: OP_PUSHBYTES_63 (P2SH20)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000463f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436257c34321f3370788a08fbad80f3f7193ed6a187", 1], + ["7n2w4", "Basic push operations: OP_PUSHBYTES_64 (P2SH20)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201408777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d05e8657f5040bb8216afa5d1857d7e55a16437087", 1], + ["aht5c", "Basic push operations: OP_PUSHBYTES_65 (P2SH20)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201418777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91448e8cf1dcbe96b9e41ecb1b568e8a6abf01abd1287", 1], + ["ht05z", "Basic push operations: OP_PUSHBYTES_66 (P2SH20)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004942000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201428777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91462ccb48c807f2157f2da2b0e3522adfffe5088e687", 1], + ["2mjdl", "Basic push operations: OP_PUSHBYTES_67 (P2SH20)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201438777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d6106281e8b4063cc0814cac1dfa08cd016f218087", 1], + ["ea0kr", "Basic push operations: OP_PUSHBYTES_68 (P2SH20)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201448777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147bb544006af09d45f249194b5f1dc548c8c25cc187", 1], + ["stqfa", "Basic push operations: OP_PUSHBYTES_69 (P2SH20)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201458777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451e4ee46c9866d974e6cb64265b7b262b3303e3187", 1], + ["q87tw", "Basic push operations: OP_PUSHBYTES_70 (P2SH20)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004d4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201468777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b8e67092b458481272f13f5af11d6e599defe09187", 1], + ["lw9n4", "Basic push operations: OP_PUSHBYTES_71 (P2SH20)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004e470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201478777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91456c4c25ec3d1076d0aa74736f8ddcfba35fb5cd587", 1], + ["ytwxz", "Basic push operations: OP_PUSHBYTES_72 (P2SH20)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201488777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91425a0c10cb84352b70f0f607ca1ffd71cc3f6583487", 1], + ["u354v", "Basic push operations: OP_PUSHBYTES_73 (P2SH20)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000504900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201498777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf24577e4ab30bb1b139778f534f20dcca55112d87", 1], + ["88ghn", "Basic push operations: OP_PUSHBYTES_74 (P2SH20)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000514a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ae9a9d759f2cdae4ee06da823bdc0c1d8e59a49387", 1], + ["za4w3", "Basic push operations: OP_PUSHBYTES_75 (P2SH20)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000524b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c637e98bbca207bca3893db7e8ac8fffded1c80a87", 1], + ["zxc7r", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (P2SH20)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000094f07028100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914edf9bd83cea96dc83ccca7664f1f9a00b29269c287", 1], + ["9raau", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (P2SH20)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000601007e010087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b0393d69a264db87eb00a790df6746567b3c1aa287", 1], + ["wyv74", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (P2SH20)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095107020100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bcaf9d3177d81983340ac9fe3f55ebd953c6d79587", 1], + ["wug7g", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (P2SH20)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095207020200517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f112128df80feccbdc473373cc90b7c00588e79987", 1], + ["srgu3", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (P2SH20)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095307020300517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914210a9c1cacf6ad5cfa8cd23caa29faac266c87c187", 1], + ["0x490", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (P2SH20)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095407020400517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914917f322665e34a7b625a1a10bfe7c1027d7598a887", 1], + ["p605h", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (P2SH20)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095507020500517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149f8302aba854d2f256ea68bd849bd6cc2d6102e487", 1], + ["9vg33", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (P2SH20)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095607020600517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143f30e7eaccdc7723e38ebec71b33a9ed6652c13287", 1], + ["jpj9a", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (P2SH20)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095707020700517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf6c32abee6107e74a82482a993565559f952bc587", 1], + ["eypxh", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (P2SH20)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095807020800517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91458afc4c0eff327badf41f3cea636b81b5ebe226a87", 1], + ["4hw4j", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (P2SH20)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095907020900517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91476364e9f7c4177c7d59b4889859dcdf62394290087", 1], + ["jp0nc", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (P2SH20)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095a07020a00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c9d469c68d6d1c5ee99a84da776a4342720e14de87", 1], + ["g4m06", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (P2SH20)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095b07020b00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140f28d0feca9fffd5da3341b8aeec84ada153ad4187", 1], + ["lfctt", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (P2SH20)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095c07020c00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c1441ecc5fa477fff34ede789e1e52db2d2ba9de87", 1], + ["98jc5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (P2SH20)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095d07020d00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd73db0b64abdde5f111cc3317fb79d69693830f87", 1], + ["tn0yk", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (P2SH20)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095e07020e00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a497900e13167138578d4ad7c1c964a3d97eba487", 1], + ["jk2j4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (P2SH20)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095f07020f00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b583fb4fbaeadd44472ed6038d58d54382fcde4887", 1], + ["pq524", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (P2SH20)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000096007021000517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145f81e01b1fb63631266af881f8812e430f73005187", 1], + ["0xf4x", "Disabled/failing operations: OP_RESERVED is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", 1], + ["al0jz", "Disabled/failing operations: OP_VER is standard if not executed (P2SH20)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", 1], + ["dx6xk", "Disabled/failing operations: OP_RETURN is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", 1], + ["7cm87", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", 1], + ["0c9yx", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_valid.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_valid.json new file mode 100644 index 00000000..136f357e --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2021_valid.json @@ -0,0 +1,121 @@ +[ + ["ste4l", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (nonP2SH)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482008777", 1], + ["6dasr", "Basic push operations: OP_PUSHBYTES_1 (nonP2SH)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482518777", 1], + ["52zmt", "Basic push operations: OP_PUSHBYTES_2 (nonP2SH)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003020000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482528777", 1], + ["p423x", "Basic push operations: OP_PUSHBYTES_3 (nonP2SH)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482538777", 1], + ["28vzk", "Basic push operations: OP_PUSHBYTES_4 (nonP2SH)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050400000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482548777", 1], + ["phylh", "Basic push operations: OP_PUSHBYTES_5 (nonP2SH)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482558777", 1], + ["duvaw", "Basic push operations: OP_PUSHBYTES_6 (nonP2SH)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000706000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482568777", 1], + ["htnez", "Basic push operations: OP_PUSHBYTES_7 (nonP2SH)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080700000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482578777", 1], + ["ycdq3", "Basic push operations: OP_PUSHBYTES_8 (nonP2SH)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009080000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482588777", 1], + ["c20q3", "Basic push operations: OP_PUSHBYTES_9 (nonP2SH)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a09000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482598777", 1], + ["mlstn", "Basic push operations: OP_PUSHBYTES_10 (nonP2SH)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a00000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825a8777", 1], + ["jmjj2", "Basic push operations: OP_PUSHBYTES_11 (nonP2SH)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c0b0000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825b8777", 1], + ["960mz", "Basic push operations: OP_PUSHBYTES_12 (nonP2SH)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d0c000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825c8777", 1], + ["6w62r", "Basic push operations: OP_PUSHBYTES_13 (nonP2SH)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d00000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825d8777", 1], + ["qjm07", "Basic push operations: OP_PUSHBYTES_14 (nonP2SH)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0e0000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825e8777", 1], + ["q9xzq", "Basic push operations: OP_PUSHBYTES_15 (nonP2SH)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100f000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825f8777", 1], + ["fln49", "Basic push operations: OP_PUSHBYTES_16 (nonP2SH)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000111000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482608777", 1], + ["hajrl", "Basic push operations: OP_PUSHBYTES_17 (nonP2SH)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000012110000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201118777", 1], + ["e6h26", "Basic push operations: OP_PUSHBYTES_18 (nonP2SH)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001312000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201128777", 1], + ["0g9pf", "Basic push operations: OP_PUSHBYTES_19 (nonP2SH)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000141300000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201138777", 1], + ["39hlr", "Basic push operations: OP_PUSHBYTES_20 (nonP2SH)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000015140000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201148777", 1], + ["qmfm4", "Basic push operations: OP_PUSHBYTES_21 (nonP2SH)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001615000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201158777", 1], + ["vqtm6", "Basic push operations: OP_PUSHBYTES_22 (nonP2SH)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000171600000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201168777", 1], + ["gw4g0", "Basic push operations: OP_PUSHBYTES_23 (nonP2SH)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018170000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201178777", 1], + ["y67he", "Basic push operations: OP_PUSHBYTES_24 (nonP2SH)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001918000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201188777", 1], + ["lad28", "Basic push operations: OP_PUSHBYTES_25 (nonP2SH)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1900000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201198777", 1], + ["xe2g3", "Basic push operations: OP_PUSHBYTES_26 (nonP2SH)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b1a0000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011a8777", 1], + ["30hyp", "Basic push operations: OP_PUSHBYTES_27 (nonP2SH)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c1b000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011b8777", 1], + ["7qefv", "Basic push operations: OP_PUSHBYTES_28 (nonP2SH)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1c00000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011c8777", 1], + ["004y8", "Basic push operations: OP_PUSHBYTES_29 (nonP2SH)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1d0000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011d8777", 1], + ["dxnpw", "Basic push operations: OP_PUSHBYTES_30 (nonP2SH)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f1e000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011e8777", 1], + ["ydw6y", "Basic push operations: OP_PUSHBYTES_31 (nonP2SH)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201f00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011f8777", 1], + ["l4k5j", "Basic push operations: OP_PUSHBYTES_32 (nonP2SH)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201208777", 1], + ["8arx8", "Basic push operations: OP_PUSHBYTES_33 (nonP2SH)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002221000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201218777", 1], + ["8wufw", "Basic push operations: OP_PUSHBYTES_34 (nonP2SH)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000232200000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201228777", 1], + ["ep6aw", "Basic push operations: OP_PUSHBYTES_35 (nonP2SH)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000024230000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201238777", 1], + ["lcm0g", "Basic push operations: OP_PUSHBYTES_36 (nonP2SH)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002524000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201248777", 1], + ["m4c7x", "Basic push operations: OP_PUSHBYTES_37 (nonP2SH)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000262500000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201258777", 1], + ["ak572", "Basic push operations: OP_PUSHBYTES_38 (nonP2SH)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027260000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201268777", 1], + ["q2a6l", "Basic push operations: OP_PUSHBYTES_39 (nonP2SH)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002827000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201278777", 1], + ["5s8lk", "Basic push operations: OP_PUSHBYTES_40 (nonP2SH)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201288777", 1], + ["qf7mf", "Basic push operations: OP_PUSHBYTES_41 (nonP2SH)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201298777", 1], + ["dqx0m", "Basic push operations: OP_PUSHBYTES_42 (nonP2SH)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012a8777", 1], + ["2567w", "Basic push operations: OP_PUSHBYTES_43 (nonP2SH)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012b8777", 1], + ["n8pnz", "Basic push operations: OP_PUSHBYTES_44 (nonP2SH)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012c8777", 1], + ["guywl", "Basic push operations: OP_PUSHBYTES_45 (nonP2SH)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012d8777", 1], + ["tmfdw", "Basic push operations: OP_PUSHBYTES_46 (nonP2SH)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012e8777", 1], + ["2tlrz", "Basic push operations: OP_PUSHBYTES_47 (nonP2SH)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000302f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012f8777", 1], + ["e8rsy", "Basic push operations: OP_PUSHBYTES_48 (nonP2SH)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201308777", 1], + ["rw33f", "Basic push operations: OP_PUSHBYTES_49 (nonP2SH)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000323100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201318777", 1], + ["xaena", "Basic push operations: OP_PUSHBYTES_50 (nonP2SH)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000033320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201328777", 1], + ["e3hnk", "Basic push operations: OP_PUSHBYTES_51 (nonP2SH)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201338777", 1], + ["fl60y", "Basic push operations: OP_PUSHBYTES_52 (nonP2SH)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000353400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201348777", 1], + ["9ndk8", "Basic push operations: OP_PUSHBYTES_53 (nonP2SH)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000036350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201358777", 1], + ["6f8pr", "Basic push operations: OP_PUSHBYTES_54 (nonP2SH)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003736000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201368777", 1], + ["ut5wh", "Basic push operations: OP_PUSHBYTES_55 (nonP2SH)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201378777", 1], + ["efkpj", "Basic push operations: OP_PUSHBYTES_56 (nonP2SH)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201388777", 1], + ["xj9r9", "Basic push operations: OP_PUSHBYTES_57 (nonP2SH)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201398777", 1], + ["lufsz", "Basic push operations: OP_PUSHBYTES_58 (nonP2SH)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013a8777", 1], + ["w25yd", "Basic push operations: OP_PUSHBYTES_59 (nonP2SH)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013b8777", 1], + ["tupvf", "Basic push operations: OP_PUSHBYTES_60 (nonP2SH)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013c8777", 1], + ["ykq09", "Basic push operations: OP_PUSHBYTES_61 (nonP2SH)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013d8777", 1], + ["62ylk", "Basic push operations: OP_PUSHBYTES_62 (nonP2SH)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013e8777", 1], + ["tq0dz", "Basic push operations: OP_PUSHBYTES_63 (nonP2SH)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000403f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013f8777", 1], + ["t7u5l", "Basic push operations: OP_PUSHBYTES_64 (nonP2SH)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201408777", 1], + ["dv38s", "Basic push operations: OP_PUSHBYTES_65 (nonP2SH)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000042410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201418777", 1], + ["mp674", "Basic push operations: OP_PUSHBYTES_66 (nonP2SH)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201428777", 1], + ["lljav", "Basic push operations: OP_PUSHBYTES_67 (nonP2SH)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000444300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201438777", 1], + ["x997y", "Basic push operations: OP_PUSHBYTES_68 (nonP2SH)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000045440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201448777", 1], + ["tuxjz", "Basic push operations: OP_PUSHBYTES_69 (nonP2SH)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201458777", 1], + ["t503j", "Basic push operations: OP_PUSHBYTES_70 (nonP2SH)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201468777", 1], + ["alt06", "Basic push operations: OP_PUSHBYTES_71 (nonP2SH)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201478777", 1], + ["y56mg", "Basic push operations: OP_PUSHBYTES_72 (nonP2SH)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004948000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201488777", 1], + ["wfr92", "Basic push operations: OP_PUSHBYTES_73 (nonP2SH)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201498777", 1], + ["xjn79", "Basic push operations: OP_PUSHBYTES_74 (nonP2SH)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014a8777", 1], + ["g0lhc", "Basic push operations: OP_PUSHBYTES_75 (nonP2SH)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014b8777", 1], + ["zun3v", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (nonP2SH)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000014f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007028100517f7587", 1], + ["4uaxt", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (nonP2SH)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000601007e010087", 1], + ["jrz8s", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (nonP2SH)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020100517f7587", 1], + ["wzn30", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (nonP2SH)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020200517f7587", 1], + ["ngjnw", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (nonP2SH)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020300517f7587", 1], + ["r6nk5", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (nonP2SH)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000154000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020400517f7587", 1], + ["l0pk8", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (nonP2SH)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000155000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020500517f7587", 1], + ["2rg8n", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (nonP2SH)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000156000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020600517f7587", 1], + ["k5xz6", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (nonP2SH)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000157000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020700517f7587", 1], + ["qgjft", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (nonP2SH)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000158000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020800517f7587", 1], + ["327xw", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (nonP2SH)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000159000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020900517f7587", 1], + ["ek4x8", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (nonP2SH)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020a00517f7587", 1], + ["rrkvk", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (nonP2SH)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015b000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020b00517f7587", 1], + ["fcwkn", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (nonP2SH)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015c000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020c00517f7587", 1], + ["r55a5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (nonP2SH)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015d000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020d00517f7587", 1], + ["plw4j", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (nonP2SH)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015e000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020e00517f7587", 1], + ["xwch4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (nonP2SH)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020f00517f7587", 1], + ["4wkp7", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (nonP2SH)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000160000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007021000517f7587", 1], + ["j4u37", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000400635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["sywcn", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006006350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["3p8ht", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (nonP2SH)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000161000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["2nth6", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (P2SH20)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003610151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["j9jae", "Disabled/failing operations: OP_RESERVED is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", 1], + ["4as4l", "Disabled/failing operations: OP_VER is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", 1], + ["4h0af", "Disabled/failing operations: OP_RETURN is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", 1], + ["3xwla", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", 1], + ["36ylw", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", 1], + ["lz2vp", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (nonP2SH)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b0", 1], + ["e9r4g", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (P2SH20)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b0000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914198821d0c372b25f4d25d71171164ac5a3a0f20d87", 1], + ["u9jep", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (nonP2SH)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b3", 1], + ["7ajt0", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (P2SH20)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b3000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914eb9fdedf708d6110ac11e3c10f5bf0e3c59a666d87", 1], + ["73c2h", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (nonP2SH)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b4", 1], + ["rkm3y", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (P2SH20)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b4000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a63f6475f705155c509056cc131bd9dcbce228ef87", 1], + ["hh7du", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (nonP2SH)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b5", 1], + ["ay989", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (P2SH20)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b5000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914703b3c7dd955ecad9d283f9ee6baddb33b11795d87", 1], + ["k87ru", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (nonP2SH)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b6", 1], + ["gk9md", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (P2SH20)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b6000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf12535fc1a7c0040b019a516904cbe2737785f387", 1], + ["9rwt7", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (nonP2SH)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b7", 1], + ["wxp8r", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (P2SH20)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b7000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146fd2ec5df0f6a6534d1cb0be74c3a1a9323681a087", 1], + ["ak0rz", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (nonP2SH)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b8", 1], + ["hqheq", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (P2SH20)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b8000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e8ca1d58727effeb462d1d2dd1b17bdc89c133d87", 1], + ["7a748", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (nonP2SH)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b9", 1], + ["gyuak", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (P2SH20)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b9000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91415727299b05b45fdaf9ac9ecf7565cfe27c3e56787", 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_invalid.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_invalid.json new file mode 100644 index 00000000..6823335a --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_invalid.json @@ -0,0 +1,274 @@ +[ + ["cjtdh", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (nonP2SH)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000101000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825187", 1], + ["urv4v", "Basic push operations: OP_PUSHBYTES_1 with missing bytes (P2SH20)", "OP_PUSHBYTES_1", "OP_SIZE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050103825187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914348babd902f9237b6d28ad1ee00bf6941bc9bddc87", 1], + ["rstq5", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (nonP2SH)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825287", 1], + ["hzs5f", "Basic push operations: OP_PUSHBYTES_2 with missing bytes (P2SH20)", "OP_PUSHBYTES_2 0x00", "OP_SIZE <2> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006020003825287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a28702ab5f8e62b7bee8a86d5dba82d797553ff287", 1], + ["3slvl", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (nonP2SH)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825387", 1], + ["9656c", "Basic push operations: OP_PUSHBYTES_3 with missing bytes (P2SH20)", "OP_PUSHBYTES_3 0x00", "OP_SIZE <3> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006030003825387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146908ef2fea5347219d7bbde297594d7f88b9ecf787", 1], + ["r76hz", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (nonP2SH)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825487", 1], + ["wnm0h", "Basic push operations: OP_PUSHBYTES_4 with missing bytes (P2SH20)", "OP_PUSHBYTES_4 0x00", "OP_SIZE <4> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006040003825487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914741dd8ac897f1921080f1349f0e499133570c7ae87", 1], + ["6eav8", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (nonP2SH)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825587", 1], + ["ludss", "Basic push operations: OP_PUSHBYTES_5 with missing bytes (P2SH20)", "OP_PUSHBYTES_5 0x00", "OP_SIZE <5> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050003825587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea47aa431f680ac44ad2630de7928853e5e9014087", 1], + ["lylne", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (nonP2SH)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825687", 1], + ["ywkn9", "Basic push operations: OP_PUSHBYTES_6 with missing bytes (P2SH20)", "OP_PUSHBYTES_6 0x00", "OP_SIZE <6> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006060003825687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143c5bd113c470fb925caad11fd469330cb3533cf487", 1], + ["hw0cc", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (nonP2SH)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825787", 1], + ["6jasz", "Basic push operations: OP_PUSHBYTES_7 with missing bytes (P2SH20)", "OP_PUSHBYTES_7 0x00", "OP_SIZE <7> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006070003825787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149b2e07b931c3f3f2fa432caf4942dc0439ae183e87", 1], + ["s6kau", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (nonP2SH)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825887", 1], + ["gvnl3", "Basic push operations: OP_PUSHBYTES_8 with missing bytes (P2SH20)", "OP_PUSHBYTES_8 0x00", "OP_SIZE <8> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006080003825887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f5401712c7ce3cc2f37cbcd59c2af053459d88eb87", 1], + ["zdmgv", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (nonP2SH)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825987", 1], + ["0xlnr", "Basic push operations: OP_PUSHBYTES_9 with missing bytes (P2SH20)", "OP_PUSHBYTES_9 0x00", "OP_SIZE <9> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006090003825987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142fcca85da981948d44ab5b0bb5c2df85df2fded787", 1], + ["rwech", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (nonP2SH)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825a87", 1], + ["sewrg", "Basic push operations: OP_PUSHBYTES_10 with missing bytes (P2SH20)", "OP_PUSHBYTES_10 0x00", "OP_SIZE <10> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060a0003825a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413d1522e20ec54a2eb73cf826dec934764816e4387", 1], + ["2v8c9", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (nonP2SH)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825b87", 1], + ["qqfhd", "Basic push operations: OP_PUSHBYTES_11 with missing bytes (P2SH20)", "OP_PUSHBYTES_11 0x00", "OP_SIZE <11> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060b0003825b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493f3f936705cdc5a08360e9ce6e0d60f41051fdb87", 1], + ["efukg", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (nonP2SH)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825c87", 1], + ["f720n", "Basic push operations: OP_PUSHBYTES_12 with missing bytes (P2SH20)", "OP_PUSHBYTES_12 0x00", "OP_SIZE <12> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060c0003825c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6e50e78a1ffeb9964e151606ea7c3b1dc7c53c087", 1], + ["rwt2g", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (nonP2SH)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825d87", 1], + ["we4vd", "Basic push operations: OP_PUSHBYTES_13 with missing bytes (P2SH20)", "OP_PUSHBYTES_13 0x00", "OP_SIZE <13> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060d0003825d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91488e5db69290eaeaad7ecf2c0b879f49efe8706d187", 1], + ["jr9uh", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (nonP2SH)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825e87", 1], + ["77a6m", "Basic push operations: OP_PUSHBYTES_14 with missing bytes (P2SH20)", "OP_PUSHBYTES_14 0x00", "OP_SIZE <14> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060e0003825e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7e842cce119144e30c2459752d1953abc66247b87", 1], + ["3wz54", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (nonP2SH)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003825f87", 1], + ["auhc8", "Basic push operations: OP_PUSHBYTES_15 with missing bytes (P2SH20)", "OP_PUSHBYTES_15 0x00", "OP_SIZE <15> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060f0003825f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914adabaf24212d2e068002b878c591dbcfbda6afb487", 1], + ["sp7ca", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (nonP2SH)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003826087", 1], + ["sthyn", "Basic push operations: OP_PUSHBYTES_16 with missing bytes (P2SH20)", "OP_PUSHBYTES_16 0x00", "OP_SIZE <16> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006100003826087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7f943bd2f61decaf4474763cdfe18ae4f178fc187", 1], + ["0zykz", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (nonP2SH)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011187", 1], + ["5z4zh", "Basic push operations: OP_PUSHBYTES_17 with missing bytes (P2SH20)", "OP_PUSHBYTES_17 0x00", "OP_SIZE <17> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000711000482011187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fede7df4488fa102dbd016ac8a73b687f1d3f987", 1], + ["k07lm", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (nonP2SH)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011287", 1], + ["zwj6u", "Basic push operations: OP_PUSHBYTES_18 with missing bytes (P2SH20)", "OP_PUSHBYTES_18 0x00", "OP_SIZE <18> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000712000482011287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145c75f97e9d4e8860ff31ca63ff47c28510ce212987", 1], + ["6uvj0", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (nonP2SH)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011387", 1], + ["t57la", "Basic push operations: OP_PUSHBYTES_19 with missing bytes (P2SH20)", "OP_PUSHBYTES_19 0x00", "OP_SIZE <19> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000713000482011387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3e18c9a3e88665d35b9bb07467088899cdccb6b87", 1], + ["03nhu", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (nonP2SH)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011487", 1], + ["rfd4e", "Basic push operations: OP_PUSHBYTES_20 with missing bytes (P2SH20)", "OP_PUSHBYTES_20 0x00", "OP_SIZE <20> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000714000482011487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ef6a89a2dbf92a35a991b641e39d73d923ff564287", 1], + ["nxxh7", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (nonP2SH)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011587", 1], + ["sun00", "Basic push operations: OP_PUSHBYTES_21 with missing bytes (P2SH20)", "OP_PUSHBYTES_21 0x00", "OP_SIZE <21> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000715000482011587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140d642007e078cc5bc88b7d72ccfd5938037be61787", 1], + ["f6sw0", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (nonP2SH)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011687", 1], + ["usg5s", "Basic push operations: OP_PUSHBYTES_22 with missing bytes (P2SH20)", "OP_PUSHBYTES_22 0x00", "OP_SIZE <22> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000716000482011687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e899033933457a8b58ae3480efba8afd3a754b5587", 1], + ["mhhlj", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (nonP2SH)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011787", 1], + ["shnln", "Basic push operations: OP_PUSHBYTES_23 with missing bytes (P2SH20)", "OP_PUSHBYTES_23 0x00", "OP_SIZE <23> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000717000482011787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ce4ea52361a4620b9f4eeb29d82310f382047fa87", 1], + ["jsd8m", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (nonP2SH)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011887", 1], + ["l4958", "Basic push operations: OP_PUSHBYTES_24 with missing bytes (P2SH20)", "OP_PUSHBYTES_24 0x00", "OP_SIZE <24> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000718000482011887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91449e7ca1c481e274a893e269da75e9f1d8660b8a187", 1], + ["08tlq", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (nonP2SH)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011987", 1], + ["xs9lz", "Basic push operations: OP_PUSHBYTES_25 with missing bytes (P2SH20)", "OP_PUSHBYTES_25 0x00", "OP_SIZE <25> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000719000482011987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914261928ca6985d6fd387f73bebd1f5207d4af3b9a87", 1], + ["xqf3t", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (nonP2SH)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011a87", 1], + ["j9khk", "Basic push operations: OP_PUSHBYTES_26 with missing bytes (P2SH20)", "OP_PUSHBYTES_26 0x00", "OP_SIZE <26> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071a000482011a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91435590178ced6b0bd207c26ade7a3cd0f4d104aeb87", 1], + ["0yspc", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (nonP2SH)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011b87", 1], + ["ktaak", "Basic push operations: OP_PUSHBYTES_27 with missing bytes (P2SH20)", "OP_PUSHBYTES_27 0x00", "OP_SIZE <27> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071b000482011b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143cb151081f4f762db4b60e42ef7dbce285b3690e87", 1], + ["68faz", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (nonP2SH)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011c87", 1], + ["akgmy", "Basic push operations: OP_PUSHBYTES_28 with missing bytes (P2SH20)", "OP_PUSHBYTES_28 0x00", "OP_SIZE <28> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071c000482011c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fbac4fa369bb6b5ee0942cd666f10a0ab0dbe1cb87", 1], + ["3vzsq", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (nonP2SH)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011d87", 1], + ["nj273", "Basic push operations: OP_PUSHBYTES_29 with missing bytes (P2SH20)", "OP_PUSHBYTES_29 0x00", "OP_SIZE <29> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071d000482011d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144b497de2489d2cb22d14e22a276440b00e8cbac487", 1], + ["n00p5", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (nonP2SH)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011e87", 1], + ["63ut4", "Basic push operations: OP_PUSHBYTES_30 with missing bytes (P2SH20)", "OP_PUSHBYTES_30 0x00", "OP_SIZE <30> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071e000482011e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143b9ccee9e96b7db838fc26158ee6ba585069a24187", 1], + ["3c78h", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (nonP2SH)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000021f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482011f87", 1], + ["m2c3w", "Basic push operations: OP_PUSHBYTES_31 with missing bytes (P2SH20)", "OP_PUSHBYTES_31 0x00", "OP_SIZE <31> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000071f000482011f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b45ae13294f970aa8f50c66828539778c80595d87", 1], + ["3lqaf", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (nonP2SH)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012087", 1], + ["57kr0", "Basic push operations: OP_PUSHBYTES_32 with missing bytes (P2SH20)", "OP_PUSHBYTES_32 0x00", "OP_SIZE <32> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000720000482012087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c8c6e9f8eed13bf72da94979c5a9c2353f07c4b287", 1], + ["726sl", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (nonP2SH)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012187", 1], + ["cp63m", "Basic push operations: OP_PUSHBYTES_33 with missing bytes (P2SH20)", "OP_PUSHBYTES_33 0x00", "OP_SIZE <33> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000721000482012187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145bbe16fe0c60055a980236177c71e53bda38980187", 1], + ["m2pgy", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (nonP2SH)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012287", 1], + ["ytyk0", "Basic push operations: OP_PUSHBYTES_34 with missing bytes (P2SH20)", "OP_PUSHBYTES_34 0x00", "OP_SIZE <34> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000722000482012287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f06972a2da955429c9486e9ad231c2ddacd58cdd87", 1], + ["ch34h", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (nonP2SH)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012387", 1], + ["ng6g7", "Basic push operations: OP_PUSHBYTES_35 with missing bytes (P2SH20)", "OP_PUSHBYTES_35 0x00", "OP_SIZE <35> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000723000482012387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac251aed5594e5f076286e8279e77f9dd0b2e3fa87", 1], + ["agpjz", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (nonP2SH)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012487", 1], + ["7lt9h", "Basic push operations: OP_PUSHBYTES_36 with missing bytes (P2SH20)", "OP_PUSHBYTES_36 0x00", "OP_SIZE <36> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000724000482012487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d7a1bb2ec0506846b456c6760d476c9119eab9eb87", 1], + ["hx5he", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (nonP2SH)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012587", 1], + ["9x5vu", "Basic push operations: OP_PUSHBYTES_37 with missing bytes (P2SH20)", "OP_PUSHBYTES_37 0x00", "OP_SIZE <37> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000725000482012587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149672ea177e21140bdf00340f1319c204759bc80d87", 1], + ["hd49m", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (nonP2SH)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012687", 1], + ["463m0", "Basic push operations: OP_PUSHBYTES_38 with missing bytes (P2SH20)", "OP_PUSHBYTES_38 0x00", "OP_SIZE <38> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000726000482012687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b97c51aa9846d3a1592a9716c72c59ea4014987b87", 1], + ["vr0ap", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (nonP2SH)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012787", 1], + ["xk5qu", "Basic push operations: OP_PUSHBYTES_39 with missing bytes (P2SH20)", "OP_PUSHBYTES_39 0x00", "OP_SIZE <39> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000727000482012787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914838dbf4b707c1c3d7209b35a80038a3e9a4aba3987", 1], + ["c0hkx", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (nonP2SH)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012887", 1], + ["3zfmh", "Basic push operations: OP_PUSHBYTES_40 with missing bytes (P2SH20)", "OP_PUSHBYTES_40 0x00", "OP_SIZE <40> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000728000482012887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ce9ab280b9bee5b3ef211315f64f010da4f136bb87", 1], + ["5er5d", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (nonP2SH)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012987", 1], + ["hk4vz", "Basic push operations: OP_PUSHBYTES_41 with missing bytes (P2SH20)", "OP_PUSHBYTES_41 0x00", "OP_SIZE <41> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000729000482012987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f7f83137b5abd79af7978c2935fd51d359d9344087", 1], + ["8dnek", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (nonP2SH)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012a87", 1], + ["snlma", "Basic push operations: OP_PUSHBYTES_42 with missing bytes (P2SH20)", "OP_PUSHBYTES_42 0x00", "OP_SIZE <42> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072a000482012a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a0d4b834bca78c0f87651005aaf094f6c170ebbb87", 1], + ["yk8ar", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (nonP2SH)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012b87", 1], + ["5l8ag", "Basic push operations: OP_PUSHBYTES_43 with missing bytes (P2SH20)", "OP_PUSHBYTES_43 0x00", "OP_SIZE <43> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072b000482012b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d553e97ceedb09c47ddc8c82ea9751a9e672f3ad87", 1], + ["u4m20", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (nonP2SH)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012c87", 1], + ["aadqw", "Basic push operations: OP_PUSHBYTES_44 with missing bytes (P2SH20)", "OP_PUSHBYTES_44 0x00", "OP_SIZE <44> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072c000482012c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442d209c70c3252e8592a302b370e389c03603ba787", 1], + ["m5d87", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (nonP2SH)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012d87", 1], + ["2q8yj", "Basic push operations: OP_PUSHBYTES_45 with missing bytes (P2SH20)", "OP_PUSHBYTES_45 0x00", "OP_SIZE <45> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072d000482012d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4465c868597e9da5cc428abdaeaf8d99c399fc787", 1], + ["zujyx", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (nonP2SH)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012e87", 1], + ["h7ed9", "Basic push operations: OP_PUSHBYTES_46 with missing bytes (P2SH20)", "OP_PUSHBYTES_46 0x00", "OP_SIZE <46> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072e000482012e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2783126d377a9c037f7c7136648757bb69f384087", 1], + ["5k5tw", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (nonP2SH)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000022f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482012f87", 1], + ["zetm9", "Basic push operations: OP_PUSHBYTES_47 with missing bytes (P2SH20)", "OP_PUSHBYTES_47 0x00", "OP_SIZE <47> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000072f000482012f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457886f74abe49501fb9f95f1bfbf7c14c16261a387", 1], + ["n542h", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (nonP2SH)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013087", 1], + ["f4rnf", "Basic push operations: OP_PUSHBYTES_48 with missing bytes (P2SH20)", "OP_PUSHBYTES_48 0x00", "OP_SIZE <48> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000730000482013087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149e97523dae1574eba4f062a427df6f092328a66b87", 1], + ["ztcwm", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (nonP2SH)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013187", 1], + ["n7rym", "Basic push operations: OP_PUSHBYTES_49 with missing bytes (P2SH20)", "OP_PUSHBYTES_49 0x00", "OP_SIZE <49> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000731000482013187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147025024f84e2c86c8c05a156fb243ca26f0e7ddf87", 1], + ["828hc", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (nonP2SH)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013287", 1], + ["l699u", "Basic push operations: OP_PUSHBYTES_50 with missing bytes (P2SH20)", "OP_PUSHBYTES_50 0x00", "OP_SIZE <50> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000732000482013287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148c8078e43e6ef3e18f396ec279cccd6d2f5a649b87", 1], + ["7vy7j", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (nonP2SH)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013387", 1], + ["acy6z", "Basic push operations: OP_PUSHBYTES_51 with missing bytes (P2SH20)", "OP_PUSHBYTES_51 0x00", "OP_SIZE <51> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000733000482013387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145551ae7ed8b3dd2e51a20fc7b2682e4f54eacbc787", 1], + ["y8ekq", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (nonP2SH)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013487", 1], + ["merlz", "Basic push operations: OP_PUSHBYTES_52 with missing bytes (P2SH20)", "OP_PUSHBYTES_52 0x00", "OP_SIZE <52> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000734000482013487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ece2479209ed0af01756bd0b47812853b7f1168387", 1], + ["9xurn", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (nonP2SH)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013587", 1], + ["3snm2", "Basic push operations: OP_PUSHBYTES_53 with missing bytes (P2SH20)", "OP_PUSHBYTES_53 0x00", "OP_SIZE <53> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000735000482013587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143ed2c324417d30554e82149f8f022da37092148787", 1], + ["6pjry", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (nonP2SH)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013687", 1], + ["lg2me", "Basic push operations: OP_PUSHBYTES_54 with missing bytes (P2SH20)", "OP_PUSHBYTES_54 0x00", "OP_SIZE <54> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000736000482013687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406aa492e4966756df323848855324d1511cc87c187", 1], + ["fnzp8", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (nonP2SH)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013787", 1], + ["v35ax", "Basic push operations: OP_PUSHBYTES_55 with missing bytes (P2SH20)", "OP_PUSHBYTES_55 0x00", "OP_SIZE <55> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000737000482013787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acc5c8a4754c20a98bd5489c16d4018d53970bfe87", 1], + ["nstfa", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (nonP2SH)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013887", 1], + ["h0q87", "Basic push operations: OP_PUSHBYTES_56 with missing bytes (P2SH20)", "OP_PUSHBYTES_56 0x00", "OP_SIZE <56> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000738000482013887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149806a867af459eae3edeac36e5c5f59681a11f0987", 1], + ["k7k3z", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (nonP2SH)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013987", 1], + ["62s9p", "Basic push operations: OP_PUSHBYTES_57 with missing bytes (P2SH20)", "OP_PUSHBYTES_57 0x00", "OP_SIZE <57> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000739000482013987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fa98af27368e371f91fed7fb5234f87719e7b1187", 1], + ["ln6zz", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (nonP2SH)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013a87", 1], + ["4peq4", "Basic push operations: OP_PUSHBYTES_58 with missing bytes (P2SH20)", "OP_PUSHBYTES_58 0x00", "OP_SIZE <58> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073a000482013a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142f28b13b3bb4dc030bc0c42485532fd6277b80ab87", 1], + ["48lr4", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (nonP2SH)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013b87", 1], + ["6wemr", "Basic push operations: OP_PUSHBYTES_59 with missing bytes (P2SH20)", "OP_PUSHBYTES_59 0x00", "OP_SIZE <59> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073b000482013b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b582383b7c0b8064929c7c696f7ff4e8ddce223087", 1], + ["ucetn", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (nonP2SH)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023c00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013c87", 1], + ["7he3a", "Basic push operations: OP_PUSHBYTES_60 with missing bytes (P2SH20)", "OP_PUSHBYTES_60 0x00", "OP_SIZE <60> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073c000482013c87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149d2262652be5fc894a7a0bafd1b0c6b476f4846887", 1], + ["4suq3", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (nonP2SH)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023d00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013d87", 1], + ["zu22a", "Basic push operations: OP_PUSHBYTES_61 with missing bytes (P2SH20)", "OP_PUSHBYTES_61 0x00", "OP_SIZE <61> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073d000482013d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914853db769d22bcbf776b88009a04b04a8e4c261ba87", 1], + ["q9prv", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (nonP2SH)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023e00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013e87", 1], + ["2ld7h", "Basic push operations: OP_PUSHBYTES_62 with missing bytes (P2SH20)", "OP_PUSHBYTES_62 0x00", "OP_SIZE <62> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073e000482013e87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142530b28ab0b0f7e276a0dbf4722a9aa532fbad7387", 1], + ["ev7mq", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (nonP2SH)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000023f00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482013f87", 1], + ["jzls3", "Basic push operations: OP_PUSHBYTES_63 with missing bytes (P2SH20)", "OP_PUSHBYTES_63 0x00", "OP_SIZE <63> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000073f000482013f87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146f3c7317731b7a41f05fb504d2e2346f21324ff687", 1], + ["54w6p", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (nonP2SH)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014087", 1], + ["f3egp", "Basic push operations: OP_PUSHBYTES_64 with missing bytes (P2SH20)", "OP_PUSHBYTES_64 0x00", "OP_SIZE <64> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000740000482014087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453eade5230e2ba9b605e24693640e4765b9bcf7b87", 1], + ["echpm", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (nonP2SH)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014187", 1], + ["jtanj", "Basic push operations: OP_PUSHBYTES_65 with missing bytes (P2SH20)", "OP_PUSHBYTES_65 0x00", "OP_SIZE <65> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000741000482014187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914407ca521c9b3cfdcaf5dd625ab017115b1e8fc0e87", 1], + ["h4aqg", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (nonP2SH)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024200000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014287", 1], + ["gtg76", "Basic push operations: OP_PUSHBYTES_66 with missing bytes (P2SH20)", "OP_PUSHBYTES_66 0x00", "OP_SIZE <66> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000742000482014287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a6e064b20d85e79ee9cf64b2395e82f4c2be57e687", 1], + ["r776d", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (nonP2SH)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024300000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014387", 1], + ["0a7tu", "Basic push operations: OP_PUSHBYTES_67 with missing bytes (P2SH20)", "OP_PUSHBYTES_67 0x00", "OP_SIZE <67> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000743000482014387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5325cb585f9efd9556afb055372f9f8fecd3dc687", 1], + ["u763z", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (nonP2SH)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024400000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014487", 1], + ["0nv6m", "Basic push operations: OP_PUSHBYTES_68 with missing bytes (P2SH20)", "OP_PUSHBYTES_68 0x00", "OP_SIZE <68> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000744000482014487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf8a760b88077e0546b9d7cd072afa779ff98ac987", 1], + ["aduhz", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (nonP2SH)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024500000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014587", 1], + ["0azna", "Basic push operations: OP_PUSHBYTES_69 with missing bytes (P2SH20)", "OP_PUSHBYTES_69 0x00", "OP_SIZE <69> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000745000482014587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b3ab6b69d924ae006e576b577e0d2d4c994ac5aa87", 1], + ["r36zv", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (nonP2SH)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024600000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014687", 1], + ["mhkav", "Basic push operations: OP_PUSHBYTES_70 with missing bytes (P2SH20)", "OP_PUSHBYTES_70 0x00", "OP_SIZE <70> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000746000482014687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144bb6e78bebb29d6c041e5a19cbdeb53b5ef04ee287", 1], + ["42w39", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (nonP2SH)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014787", 1], + ["gscmv", "Basic push operations: OP_PUSHBYTES_71 with missing bytes (P2SH20)", "OP_PUSHBYTES_71 0x00", "OP_SIZE <71> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000747000482014787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91479f1f5998ddca7c4e2b672afc5a26b2b8b2ffb4187", 1], + ["lcxtm", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (nonP2SH)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024800000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014887", 1], + ["glvlg", "Basic push operations: OP_PUSHBYTES_72 with missing bytes (P2SH20)", "OP_PUSHBYTES_72 0x00", "OP_SIZE <72> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000748000482014887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e652aaf57b7198f80e3b78401c89cd96c6a6c8bd87", 1], + ["z3t06", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (nonP2SH)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024900000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014987", 1], + ["hvje4", "Basic push operations: OP_PUSHBYTES_73 with missing bytes (P2SH20)", "OP_PUSHBYTES_73 0x00", "OP_SIZE <73> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000749000482014987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141cef04ad6c1fe8e610323192fe4058df0c91d6c987", 1], + ["zja07", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (nonP2SH)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024a00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014a87", 1], + ["r3ycz", "Basic push operations: OP_PUSHBYTES_74 with missing bytes (P2SH20)", "OP_PUSHBYTES_74 0x00", "OP_SIZE <74> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074a000482014a87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c791c5359a5b6631fd28c4a359221c40af95ec4887", 1], + ["kgq43", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (nonP2SH)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000024b00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482014b87", 1], + ["j4r6x", "Basic push operations: OP_PUSHBYTES_75 with missing bytes (P2SH20)", "OP_PUSHBYTES_75 0x00", "OP_SIZE <75> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000074b000482014b87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac95375c38c1922bea1a42ab755832d3474d9d5a87", 1], + ["x8uj0", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000451635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["7jru3", "Standard transaction inputs may only include push operations: OP_RESERVED is only valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<1> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006516350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["txj23", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", 1], + ["y5xzt", "Disabled/failing operations: OP_RESERVED fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", 1], + ["cd60d", "Disabled/failing operations: OP_VER fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", 1], + ["p4v07", "Disabled/failing operations: OP_VER fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", 1], + ["dk9kf", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463656851", 1], + ["n0ye4", "Disabled/failing operations: OP_VERIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463656851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91457dc1a70809660410571bdb537e003fec3428bc487", 1], + ["j865d", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463666851", 1], + ["pcrac", "Disabled/failing operations: OP_VERNOTIF fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_VERNOTIF OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463666851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914403de1b3ab6d2cfa5fb35620f088769beb080f0287", 1], + ["f8605", "Disabled/failing operations: OP_RETURN fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", 1], + ["j8gj8", "Disabled/failing operations: OP_RETURN fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", 1], + ["z5zyz", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463836851", 1], + ["5xw0n", "Disabled/failing operations: OP_INVERT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_INVERT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463836851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149a24bd2a162d0f4df5fe7fef6d66fccacd0e5f9887", 1], + ["9m6kt", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", 1], + ["z3rkc", "Disabled/failing operations: OP_RESERVED1 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006510463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", 1], + ["a7c26", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (nonP2SH)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", 1], + ["u5wae", "Disabled/failing operations: OP_RESERVED2 fails evaluation if executed (P2SH20)", "<1>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", 1], + ["alwy0", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638d6851", 1], + ["s49g9", "Disabled/failing operations: OP_2MUL fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2MUL OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638d6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141aa1b8bcc573b4fe778d7912487101446b016e9187", 1], + ["g3qe3", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638e6851", 1], + ["jnfe2", "Disabled/failing operations: OP_2DIV fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_2DIV OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638e6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142acbb440e71f59b71efdfc6d81954b7dc7130c7587", 1], + ["2q4a4", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463986851", 1], + ["49r5l", "Disabled/failing operations: OP_LSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_LSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463986851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a2ec10dbc7a3ba53b6836c48756ad98a50543ff87", 1], + ["9t87w", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (nonP2SH)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463996851", 1], + ["su3pf", "Disabled/failing operations: OP_RSHIFT fails evaluation even if not executed (P2SH20)", "<0>", "OP_IF OP_RSHIFT OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463996851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145cf960dc2e4d0da4a3642b8ac200d39faca2675587", 1], + ["6lwsk", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 1], + ["q5jpu", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1, expects 0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 1], + ["9vqdu", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825388abc187", 1], + ["5myl3", "Transaction inspection: Active bytecode begins after the last OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03abc18706825388abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91455a363671564191ddf82d56bcebb6ed469eb382087", 1], + ["nha5r", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (P2SH20)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104c0c7c188000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d13ea3d424daf33bc3d66e0987dd034ec1f96b5f87", 1], + ["0z8mh", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302a914000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000009c1a901877e7ec0c787", 1], + ["j8uzj", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["sdqs6", "Transaction inspection: OP_TXVERSION (version == 2, while version 3 is expected) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["lnw7q", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 1], + ["prjxm", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs, 1 expected) (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 1], + ["949mh", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["usfq9", "Transaction inspection: OP_TXLOCKTIME (locktime == 0, but expects 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["z4ygy", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (nonP2SH)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402112700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + ["lgyyx", "Transaction inspection: OP_UTXOVALUE (10000, expects 10001) (P2SH20)", "<10_001> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070211270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + ["hxtst", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (nonP2SH)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc675", 1], + ["05pdg", "Transaction inspection: OP_UTXOVALUE (ignore result, negative index) (P2SH20)", "<1>", "<-1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91418edf008814b787b1ad6ce2609acf3cde52c7c1e87", 1], + ["hvapj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c675", 1], + ["t26yj", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914420bf68700082813d30ab118efb905bfd182456d87", 1], + ["3wlp4", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (nonP2SH)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c675", 1], + ["5gaqe", "Transaction inspection: OP_UTXOVALUE (ignore result, index 2, greater than maximum index) (P2SH20)", "<1>", "<2> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143a4c2f5e4735fc878b1bbd5b5954f514d5c8be8887", 1], + ["9crn2", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000b0900000000000000800000000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008002c687"], + ["j7l4x", "Transaction inspection: OP_UTXOVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000e090000000000000080000002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01000000000000008017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["ezfrr", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (P2SH20)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080351c7870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", 1], + ["e5r7z", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (nonP2SH)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001817a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", 1], + ["h5zg4", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc775", 1], + ["ud8dm", "Transaction inspection: OP_UTXOBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c48a1a82842311c3d918d603c81e2d78f8c838f287", 1], + ["s99rk", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c775", 1], + ["hu2xq", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ca62f6db097fa158803514b761256aade895efc87", 1], + ["n6fk2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c775", 1], + ["580u2", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a42e9d731b888b654730a3f2ad520559cd1063b487", 1], + ["wh04c", "Transaction inspection: OP_UTXOBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd09024d0202000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00017551c775", 1], + ["njcfy", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (P2SH20)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000520402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a4f3c4e1e03734f5e4f73f136152b28f2957cbc18710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187"], + ["t5nr8", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (nonP2SH)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000006017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000000f00c788ab51c788ab52c788ab53c787102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["8hky8", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000001000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", 1], + ["lplef", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, expected 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000010351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", 1], + ["e27rx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c875", 1], + ["kgqpx", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914523e07ae6a2269faca32b65b14acd07ccbda0e5e87", 1], + ["qy39t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc875", 1], + ["nwg49", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140ad568a49f50fb90af00472519b23ff584cb7ed087", 1], + ["rnf4n", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c875", 1], + ["mwv2r", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2, greater than maximum input) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787", 1], + ["0852u", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (nonP2SH)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", 1], + ["wrqea", "Transaction inspection: OP_OUTPOINTINDEX (input 1, expected 0) (P2SH20)", "<0>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", 1], + ["ael35", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100c975", 1], + ["drlfk", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91453c8a5a4de090d9a337c7db83f2c443a9605d8c387", 1], + ["uugrq", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fc975", 1], + ["yw80j", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fc975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145e9af27552de9ba7a9bea88b5aa0ff55bf6e3e8387", 1], + ["4djj0", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352c975", 1], + ["f34c4", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ef1c56fca391fa18de57061d8184c057335523087", 1], + ["0xhy0", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (P2SH20)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000065104ca015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144518d7d2d7c5e959b74d272957abb3a4e22f511787", 1], + ["5yxye", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (P2SH20)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b51ab510769ca0351ab5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d2742d27a3ea54a2fefae6733492b5258cd87cbd87", 1], + ["8wnzm", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (nonP2SH)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000d76827c7eab77767eab51ca8851", 1], + ["2wrww", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017ca527faba902a9147c7e01877eab51c788517f75015187", 1], + ["47zzy", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000003ca5187", 1], + ["rwe6p", "Transaction inspection: OP_INPUTBYTECODE (input 1, expected missing OP_PUSHBYTES_1) (P2SH20)", "<1>", "OP_INPUTBYTECODE <1> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000055103ca5187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fdfd3039b9c13e2268314e703118bf57a227a16b87", 1], + ["847mu", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100ca75", 1], + ["c9vma", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a5b73676cda7241ca379713603db7ca1f3e0ea0c87", 1], + ["33hhj", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fca75", 1], + ["rs7er", "Transaction inspection: OP_INPUTBYTECODE (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a20ef8fa3dc1d87aa73ee6e2ddd706a23e8e5de87", 1], + ["ts7nd", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352ca75", 1], + ["f89ml", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914266206a75755c70c126f777448e6a410391d637687", 1], + ["lsjpv", "Transaction inspection: OP_INPUTBYTECODE (excessive size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd10024d09024d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040551ca8777", 1], + ["s23zf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0a02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", 1], + ["v0689", "Transaction inspection: OP_INPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f02514d0602000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", 1], + ["wsnyq", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", 1], + ["zku65", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, expected 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", 1], + ["80zyt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["xwd6l", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; while locktime is not disabled for this transaction, it is disabled for input 0, causing a failure) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17500cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["fc7sf", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (nonP2SH)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020100cb75", 1], + ["qpnt2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1, non-minimally encoded) (P2SH20)", "<1>", "<0x0100> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020100cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7b7c219eda22932c71ff387ecf8b5fbe0276bad87", 1], + ["khjgz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (nonP2SH)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcb75", 1], + ["n2cms", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, negative input) (P2SH20)", "<1>", "<-1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144d11fe0414239057aa155fe2ec9fbb766c7d6e3c87", 1], + ["05f3k", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cb75", 1], + ["m9zlt", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2, greater than maximum input index) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887", 1], + ["jtuew", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["6terc", "Transaction inspection: OP_OUTPUTVALUE (output 0, expected 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["t237p", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cc75", 1], + ["7auug", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e5cafd4ef09b908959aa8c4bbe12b2cba38f4be787", 1], + ["ec2zv", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (nonP2SH)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411cc4abed5d58f1236ae7b462b587d0db9af0a83e2867c6d065db42e7ea5d440a81383d29c05764bf4d2ba55f67cf245825b4aaa3b43eb1b5d4c68e9257c75abac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcc751127000000000000034fcc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcc75", 1], + ["8g609", "Transaction inspection: OP_OUTPUTVALUE (ignore result, negative output) (P2SH20)", "<1>", "<-1> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e60ec935181e309b69033f80e6e8ef4954c47b5193628500c4852faa94e6336dfe0463d5a07bd2a10f4f20c74c02b4fad477441e367b1dff5be81b84cbf97225c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcc750000000002102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487112700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de348700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914caa9fb75d36bd9c6a1a426e22a608d538479de3487", 1], + ["7kz9t", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cc7511270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", 1], + ["s3kn5", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000002102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", 1], + ["qy9xt", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (nonP2SH)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644120d73f4435c2901df73c8fb5e7ea68a9548aceb72f34c37a3dd4ba4870c04e562cb934056d2a8faeef6609dd47ebcc678430607f3f1e873fdf059e8bd069e888c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b09000000000000008000000000000001000000000000008002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["cra58", "Transaction inspection: OP_OUTPUTVALUE (9223372036854775808 satoshis, exceeds maximum VM Number) (P2SH20)", "<9223372036854775808> <0>", "OP_OUTPUTVALUE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644154d8a3508ce703e59cff49ccf62e2321c8e90337db623028ba2399368ffbad7c98a2c39a5e27a72d3ddf80c080c1e50661d5ee3b2a97361857ea80b132c424bbc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e090000000000000080000002cc870000000001000000000000008017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["sj69g", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["4zqq3", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, expected ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["myk99", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (nonP2SH)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005020000cd75", 1], + ["x9306", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0, non-minimally encoded) (P2SH20)", "<1>", "<0x0000> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000075105020000cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0667ad0678c5ac9189d611b7feb1ba9857040eb87", 1], + ["mkmyw", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (nonP2SH)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064415d67fee69ca11c78082eea7c40b227af8c93a65d05d77778723ddd324419a8fc82317672e98f8d2718e619f090c7c824c5678088792155426f6f48f5611e3bddc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000021027000000000000034fcd751127000000000000034fcd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000034fcd75", 1], + ["fshgr", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, negative output index) (P2SH20)", "<1>", "<-1> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644108e647f5721201530190228be5b6c5d66d259a1b451c18e0070b90dc73233a7a37108c1cb8a3723400278d0f79677929f8e18e44f24b89d86175b7b1c69bf912c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000551034fcd750000000002102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887112700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d788700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447f30d3037b60fc850ba838ab8c180a775270d7887", 1], + ["44p7j", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000210270000000000000352cd7511270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", 1], + ["xvtvk", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2, greater than maximum output index) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000002102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", 1], + ["6nju2", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0c024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["36d8k", "Transaction inspection: OP_OUTPUTBYTECODE (excessive size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd10024d09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00010203040300cd8700000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["qkz9v", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["vf3j5", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064414a9e1db648e7d657dda250a532f605d3d87552e5be5eecf955998ff0cefc09a1b35607bb859396f98c1e5ec205c76c784af9ee7ba2ac522b899abcd88342324ac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd09026a4d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_standard.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_standard.json new file mode 100644 index 00000000..57e43092 --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_standard.json @@ -0,0 +1,234 @@ +[ + ["kqlqv", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (P2SH20)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000482008777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91498e86c508e780cfb822bba3d5ab9b3e30450196b87", 1], + ["f6790", "Basic push operations: OP_PUSHBYTES_1 (P2SH20)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000701000482518777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914774415af6b71a5e4aafebe27271713238faef29b87", 1], + ["642k0", "Basic push operations: OP_PUSHBYTES_2 (P2SH20)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080200000482528777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ac980e4b702ffa3f36d97d0a0150b20fca324cfd87", 1], + ["wp57c", "Basic push operations: OP_PUSHBYTES_3 (P2SH20)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009030000000482538777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bc84dc62228d6b7c1b5fda70ef20aa281642c25087", 1], + ["rhufv", "Basic push operations: OP_PUSHBYTES_4 (P2SH20)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a04000000000482548777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914520f81159716d7d4fdba01c9a499d719a1b109a487", 1], + ["sydt9", "Basic push operations: OP_PUSHBYTES_5 (P2SH20)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0500000000000482558777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f47df2fd6b5300617883d49f98e06fdc83e938f887", 1], + ["yszmd", "Basic push operations: OP_PUSHBYTES_6 (P2SH20)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c060000000000000482568777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91427d3e4ba6d657a2802adb4605d6f1b22d8ab03a987", 1], + ["cp088", "Basic push operations: OP_PUSHBYTES_7 (P2SH20)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d07000000000000000482578777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914acb9845c4d630864bf618f55594a21f70598546c87", 1], + ["5xy5w", "Basic push operations: OP_PUSHBYTES_8 (P2SH20)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0800000000000000000482588777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143187995004a81a0c40c8aee658b94bc067b8c41987", 1], + ["sgxp5", "Basic push operations: OP_PUSHBYTES_9 (P2SH20)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f090000000000000000000482598777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914051c402d952b9383195a9684874309515ab42d5087", 1], + ["f6rhr", "Basic push operations: OP_PUSHBYTES_10 (P2SH20)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100a0000000000000000000004825a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140fcfebf7f52d455ece34b52d922eeffe789b4b2f87", 1], + ["lqg4v", "Basic push operations: OP_PUSHBYTES_11 (P2SH20)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000110b000000000000000000000004825b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e6a58ca1780653073a7715e6bef9570a42fff99287", 1], + ["pzrxc", "Basic push operations: OP_PUSHBYTES_12 (P2SH20)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120c00000000000000000000000004825c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148d3d79625e4f5cc9474d2056fb514dabdbf2853e87", 1], + ["ym5tw", "Basic push operations: OP_PUSHBYTES_13 (P2SH20)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000130d0000000000000000000000000004825d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cba13f4df2f3c799be0fda2fda348563fcf3bffc87", 1], + ["4hd9u", "Basic push operations: OP_PUSHBYTES_14 (P2SH20)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000140e000000000000000000000000000004825e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914222ec246a4c5c463d2a2e9f3716d7a858d8b37c687", 1], + ["j5rjr", "Basic push operations: OP_PUSHBYTES_15 (P2SH20)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000150f00000000000000000000000000000004825f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aaf70e5c15367a5802d82aa514f5432e08c583987", 1], + ["6ljf5", "Basic push operations: OP_PUSHBYTES_16 (P2SH20)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001610000000000000000000000000000000000482608777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914264720413b68ba6ce2cb2f8c7c92ec828a82f3bc87", 1], + ["dl6f8", "Basic push operations: OP_PUSHBYTES_17 (P2SH20)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018110000000000000000000000000000000000058201118777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc71efd38361fd302b320bb7fb0fda918033095687", 1], + ["k39kg", "Basic push operations: OP_PUSHBYTES_18 (P2SH20)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001912000000000000000000000000000000000000058201128777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dca36876dafe5650db8bab999fd2088b937804587", 1], + ["nvau6", "Basic push operations: OP_PUSHBYTES_19 (P2SH20)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1300000000000000000000000000000000000000058201138777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d4b5556e2b7ba6ce35bf5654bea3e9e4b98d269587", 1], + ["3e553", "Basic push operations: OP_PUSHBYTES_20 (P2SH20)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b140000000000000000000000000000000000000000058201148777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b98ce584b9ce151836da251897518e90825bbea587", 1], + ["u45d9", "Basic push operations: OP_PUSHBYTES_21 (P2SH20)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c15000000000000000000000000000000000000000000058201158777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149c6450943963d8e9a47d8167391186d31f3ff91d87", 1], + ["cx7gd", "Basic push operations: OP_PUSHBYTES_22 (P2SH20)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1600000000000000000000000000000000000000000000058201168777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451edea7c56cb0626bd8d999ba0e6f9cee64f273387", 1], + ["f676p", "Basic push operations: OP_PUSHBYTES_23 (P2SH20)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e170000000000000000000000000000000000000000000000058201178777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145d95fee0a25523164be8b007d6e482256358070887", 1], + ["cw9dh", "Basic push operations: OP_PUSHBYTES_24 (P2SH20)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f18000000000000000000000000000000000000000000000000058201188777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91495e25cc3889575b41fdf42f61f34b94a2c7d181d87", 1], + ["jy0ze", "Basic push operations: OP_PUSHBYTES_25 (P2SH20)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201900000000000000000000000000000000000000000000000000058201198777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914221ed86a048b577912b56d6a03474332cb8e8b2087", 1], + ["q7ryt", "Basic push operations: OP_PUSHBYTES_26 (P2SH20)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000211a00000000000000000000000000000000000000000000000000000582011a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143337f7e1930e5ca79030cf337703f9566339a91887", 1], + ["w7hj2", "Basic push operations: OP_PUSHBYTES_27 (P2SH20)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000221b0000000000000000000000000000000000000000000000000000000582011b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91487ad0ed1b3849a5741ceac834d6a3d0826972fcb87", 1], + ["6afry", "Basic push operations: OP_PUSHBYTES_28 (P2SH20)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000231c000000000000000000000000000000000000000000000000000000000582011c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c64ef31fb53d0c33398bbc61b3b3d56edf3e596487", 1], + ["khjzs", "Basic push operations: OP_PUSHBYTES_29 (P2SH20)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000241d00000000000000000000000000000000000000000000000000000000000582011d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146df2fe5bdd6777f28518e32087bfe8bbc04cf0dc87", 1], + ["ncfyd", "Basic push operations: OP_PUSHBYTES_30 (P2SH20)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000251e0000000000000000000000000000000000000000000000000000000000000582011e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91408afde6a1b5b1ba056871d80d469c7f441e90efd87", 1], + ["rcm0n", "Basic push operations: OP_PUSHBYTES_31 (P2SH20)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000261f000000000000000000000000000000000000000000000000000000000000000582011f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140dad77efc6ca13ba74f97d3513152ead6b56f59a87", 1], + ["gwa65", "Basic push operations: OP_PUSHBYTES_32 (P2SH20)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027200000000000000000000000000000000000000000000000000000000000000000058201208777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406f3e1df460e90acc01f6b5c02106e91667165bf87", 1], + ["lf8vg", "Basic push operations: OP_PUSHBYTES_33 (P2SH20)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002821000000000000000000000000000000000000000000000000000000000000000000058201218777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7499543f52b711cb5ef3c0ba36b4c6dc621083487", 1], + ["3hycv", "Basic push operations: OP_PUSHBYTES_34 (P2SH20)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292200000000000000000000000000000000000000000000000000000000000000000000058201228777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147aeeacc939e76be0859bd4d1203877f11de5535e87", 1], + ["djdke", "Basic push operations: OP_PUSHBYTES_35 (P2SH20)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a230000000000000000000000000000000000000000000000000000000000000000000000058201238777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f868100124fa1ebfd00b040dd73f5bc3cb2a55087", 1], + ["p2gl3", "Basic push operations: OP_PUSHBYTES_36 (P2SH20)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b24000000000000000000000000000000000000000000000000000000000000000000000000058201248777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c830e4841b4c717566a6b2f35abad13eb4b223087", 1], + ["d4ncp", "Basic push operations: OP_PUSHBYTES_37 (P2SH20)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2500000000000000000000000000000000000000000000000000000000000000000000000000058201258777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c2b2e1e363ecafb5b3df03f0a7b5d15d51a9965687", 1], + ["mmkjk", "Basic push operations: OP_PUSHBYTES_38 (P2SH20)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d260000000000000000000000000000000000000000000000000000000000000000000000000000058201268777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141ce3288a4a81ea394c8bad2ad35271d82f8a115a87", 1], + ["ampe2", "Basic push operations: OP_PUSHBYTES_39 (P2SH20)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e27000000000000000000000000000000000000000000000000000000000000000000000000000000058201278777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91466b50d17451438b34f216a14b2f27efc72998f3887", 1], + ["ahnxk", "Basic push operations: OP_PUSHBYTES_40 (P2SH20)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2800000000000000000000000000000000000000000000000000000000000000000000000000000000058201288777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914e7ed79eb8b3f886bd65968d05b950dc539c4325587", 1], + ["2ewj3", "Basic push operations: OP_PUSHBYTES_41 (P2SH20)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000030290000000000000000000000000000000000000000000000000000000000000000000000000000000000058201298777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91426c2d85bb90707c2e985be6f8be682d327bb4a2b87", 1], + ["mu75l", "Basic push operations: OP_PUSHBYTES_42 (P2SH20)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000312a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148f9872f9130fe0a1baae088d4a5d47d37ac6a5c687", 1], + ["7pjdc", "Basic push operations: OP_PUSHBYTES_43 (P2SH20)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000322b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b7d4cac3da175eebc585e4274bf3a76d3096a37e87", 1], + ["jpk5z", "Basic push operations: OP_PUSHBYTES_44 (P2SH20)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000332c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a8a8d7455806683a568f2362182ceec0641b40b987", 1], + ["tgpk4", "Basic push operations: OP_PUSHBYTES_45 (P2SH20)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000342d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91432ea958fd4cc9a322cb80ce5856334c457454ba887", 1], + ["8vyze", "Basic push operations: OP_PUSHBYTES_46 (P2SH20)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000352e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914de37f1ef90eb550c3b3d996eb7016a73eed6852f87", 1], + ["cy7a8", "Basic push operations: OP_PUSHBYTES_47 (P2SH20)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000362f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582012f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a3758cb9ba5090b6b32c2552ee51c04b398eba1c87", 1], + ["qsc6d", "Basic push operations: OP_PUSHBYTES_48 (P2SH20)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201308777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914155b3d04f9e00ebb9fc1a30e0661cde97c2abd1787", 1], + ["mqv2w", "Basic push operations: OP_PUSHBYTES_49 (P2SH20)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201318777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428c049cbccaf76ccc3a02b402e91affbd646948c87", 1], + ["hfd6e", "Basic push operations: OP_PUSHBYTES_50 (P2SH20)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201328777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e320b3d5b862f9f6a8de45829cb07a8984e971c87", 1], + ["9slcu", "Basic push operations: OP_PUSHBYTES_51 (P2SH20)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201338777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d0cb6e4f6a1f7c8095692d22ef3b0cd0295696b087", 1], + ["r7zmd", "Basic push operations: OP_PUSHBYTES_52 (P2SH20)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201348777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91447c59d45ad8efaed1dfd7048511310bbdacb89e887", 1], + ["2u4xy", "Basic push operations: OP_PUSHBYTES_53 (P2SH20)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201358777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914710f50b3b6aa9a6f4d972f4782636f2cf77013be87", 1], + ["2wqdz", "Basic push operations: OP_PUSHBYTES_54 (P2SH20)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201368777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c6448f6bc26a215cf56e0f902f88b7954661f24c87", 1], + ["c8kcl", "Basic push operations: OP_PUSHBYTES_55 (P2SH20)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201378777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd9e0c67301010cb39ea26e0e77745a764a472be87", 1], + ["fh5t0", "Basic push operations: OP_PUSHBYTES_56 (P2SH20)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201388777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142c05abd339742b3484ddcfefa6467fb69be20e8c87", 1], + ["d6xk3", "Basic push operations: OP_PUSHBYTES_57 (P2SH20)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201398777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91406336beb02d2b38bf56a0924cefb269e9295165987", 1], + ["88dq6", "Basic push operations: OP_PUSHBYTES_58 (P2SH20)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000413a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b4856711b25d23528c6afacedf0e46d27d5188b387", 1], + ["zn0ld", "Basic push operations: OP_PUSHBYTES_59 (P2SH20)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000423b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fc9deee182ff2c2a9cffe25d8dfe6ce6bf4eabe187", 1], + ["3fgnc", "Basic push operations: OP_PUSHBYTES_60 (P2SH20)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000433c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013c8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cfe57fdc4d23d94a5e72f6e034aba262bd7b864a87", 1], + ["98ch8", "Basic push operations: OP_PUSHBYTES_61 (P2SH20)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000443d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013d8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914134265a6356aead5389df701300d2772933c258587", 1], + ["0dj2s", "Basic push operations: OP_PUSHBYTES_62 (P2SH20)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000453e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013e8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141f951edfc4b17e8b0f3bba38b34ff8a559d366f487", 1], + ["klxmx", "Basic push operations: OP_PUSHBYTES_63 (P2SH20)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000463f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582013f8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436257c34321f3370788a08fbad80f3f7193ed6a187", 1], + ["7n2w4", "Basic push operations: OP_PUSHBYTES_64 (P2SH20)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201408777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d05e8657f5040bb8216afa5d1857d7e55a16437087", 1], + ["aht5c", "Basic push operations: OP_PUSHBYTES_65 (P2SH20)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201418777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91448e8cf1dcbe96b9e41ecb1b568e8a6abf01abd1287", 1], + ["ht05z", "Basic push operations: OP_PUSHBYTES_66 (P2SH20)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004942000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201428777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91462ccb48c807f2157f2da2b0e3522adfffe5088e687", 1], + ["2mjdl", "Basic push operations: OP_PUSHBYTES_67 (P2SH20)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201438777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d6106281e8b4063cc0814cac1dfa08cd016f218087", 1], + ["ea0kr", "Basic push operations: OP_PUSHBYTES_68 (P2SH20)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201448777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147bb544006af09d45f249194b5f1dc548c8c25cc187", 1], + ["stqfa", "Basic push operations: OP_PUSHBYTES_69 (P2SH20)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201458777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91451e4ee46c9866d974e6cb64265b7b262b3303e3187", 1], + ["q87tw", "Basic push operations: OP_PUSHBYTES_70 (P2SH20)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004d4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201468777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b8e67092b458481272f13f5af11d6e599defe09187", 1], + ["lw9n4", "Basic push operations: OP_PUSHBYTES_71 (P2SH20)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004e470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201478777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91456c4c25ec3d1076d0aa74736f8ddcfba35fb5cd587", 1], + ["ytwxz", "Basic push operations: OP_PUSHBYTES_72 (P2SH20)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004f48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201488777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91425a0c10cb84352b70f0f607ca1ffd71cc3f6583487", 1], + ["u354v", "Basic push operations: OP_PUSHBYTES_73 (P2SH20)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000504900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058201498777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf24577e4ab30bb1b139778f534f20dcca55112d87", 1], + ["88ghn", "Basic push operations: OP_PUSHBYTES_74 (P2SH20)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000514a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014a8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ae9a9d759f2cdae4ee06da823bdc0c1d8e59a49387", 1], + ["za4w3", "Basic push operations: OP_PUSHBYTES_75 (P2SH20)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000524b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000582014b8777000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c637e98bbca207bca3893db7e8ac8fffded1c80a87", 1], + ["zxc7r", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (P2SH20)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000094f07028100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914edf9bd83cea96dc83ccca7664f1f9a00b29269c287", 1], + ["9raau", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (P2SH20)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000601007e010087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b0393d69a264db87eb00a790df6746567b3c1aa287", 1], + ["wyv74", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (P2SH20)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095107020100517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bcaf9d3177d81983340ac9fe3f55ebd953c6d79587", 1], + ["wug7g", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (P2SH20)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095207020200517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f112128df80feccbdc473373cc90b7c00588e79987", 1], + ["srgu3", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (P2SH20)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095307020300517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914210a9c1cacf6ad5cfa8cd23caa29faac266c87c187", 1], + ["0x490", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (P2SH20)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095407020400517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914917f322665e34a7b625a1a10bfe7c1027d7598a887", 1], + ["p605h", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (P2SH20)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095507020500517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9149f8302aba854d2f256ea68bd849bd6cc2d6102e487", 1], + ["9vg33", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (P2SH20)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095607020600517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143f30e7eaccdc7723e38ebec71b33a9ed6652c13287", 1], + ["jpj9a", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (P2SH20)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095707020700517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf6c32abee6107e74a82482a993565559f952bc587", 1], + ["eypxh", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (P2SH20)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095807020800517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91458afc4c0eff327badf41f3cea636b81b5ebe226a87", 1], + ["4hw4j", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (P2SH20)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095907020900517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91476364e9f7c4177c7d59b4889859dcdf62394290087", 1], + ["jp0nc", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (P2SH20)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095a07020a00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c9d469c68d6d1c5ee99a84da776a4342720e14de87", 1], + ["g4m06", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (P2SH20)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095b07020b00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140f28d0feca9fffd5da3341b8aeec84ada153ad4187", 1], + ["lfctt", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (P2SH20)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095c07020c00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c1441ecc5fa477fff34ede789e1e52db2d2ba9de87", 1], + ["98jc5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (P2SH20)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095d07020d00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd73db0b64abdde5f111cc3317fb79d69693830f87", 1], + ["tn0yk", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (P2SH20)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095e07020e00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148a497900e13167138578d4ad7c1c964a3d97eba487", 1], + ["jk2j4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (P2SH20)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000095f07020f00517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b583fb4fbaeadd44472ed6038d58d54382fcde4887", 1], + ["pq524", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (P2SH20)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000096007021000517f7587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145f81e01b1fb63631266af881f8812e430f73005187", 1], + ["0xf4x", "Disabled/failing operations: OP_RESERVED is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463506851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914302292c05f453a36332a5dc1f66e51e6934cc48687", 1], + ["al0jz", "Disabled/failing operations: OP_VER is standard if not executed (P2SH20)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463626851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cd7506d3d185774d90b0b6c9830bfffc7492c11587", 1], + ["dx6xk", "Disabled/failing operations: OP_RETURN is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004636a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91434569984efaf247f2134d53de851bcdbc2c0446387", 1], + ["7cm87", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006000463896851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a594f2fcd8f8d8f878e93a4b2a3446892ebea37287", 1], + ["0c9yx", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (P2SH20)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060004638a6851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91439471b07816fe9d0683e386e328f8f5c80ca911a87", 1], + ["alcrs", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c068c0c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ea3868cab03ec45c9868fe7d658511c73d12243c87", 1], + ["2assf", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c168c1c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914477b47786ea1fb2e90f5cc2c4acdd3e376815a7287", 1], + ["lguf9", "Conditionally executed operations: OP_TXVERSION is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c268c2c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91420f70f0d60b4457ccd9efe9990dd5f18c67e5feb87", 1], + ["n2ylt", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c368c3c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914850d090785681c32fd42795b106efe894555c08987", 1], + ["6twdw", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c468c4c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a2fb505dfa0eb3e2ca0325a9d5a0f36a4077eeb787", 1], + ["mrpue", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (P2SH20)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008000663c568c5c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143bc61a327cb0a99af66276434112bdec93b13c3e87", 1], + ["6my5d", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c66800c600c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140c7f6c545c7fbe0e521a99fd2414f1d616f0a01687", 1], + ["5z4k5", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c76800c700c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144879033da25aedede3be2bacbe1b7da877fd042f87", 1], + ["f7mt8", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c86800c800c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91409fc037b8160b2add4528781119d28c259a4ed6287", 1], + ["ajmc2", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300c96800c900c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144997d5f6154f4247d270c1ca6bd10c1d0b6905d687", 1], + ["pzg7m", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300ca6800ca00ca87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142e70d53d53ebbe279c00c6e9f5cf6451872604d687", 1], + ["2cakt", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cb6800cb00cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914c7d9d372f7d53761530cc6d60a923fdc2b4fd50f87", 1], + ["5drus", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cc6800cc00cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d36b18a86a63c10fbd478761af3bd396fd2f533b87", 1], + ["302t6", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (P2SH20)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b00096300cd6800cd00cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142ed955210967b8a4404cc0d583e7babefb7f27c987", 1], + ["6qrjv", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (P2SH20)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c0c08b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b11c6e0c2629f1cbe853a37b7334e610d00735d187", 1], + ["r3wdg", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (P2SH20)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c1c1bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e2ba2745f5921de3adac41be6516ada6556358587", 1], + ["qedqk", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (P2SH20)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c2c28b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914db5fe9c95e4b14f8cfab965daec5db61ead4eaf687", 1], + ["8rlh9", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c3c38b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9147417cae3f1e6718721b357981081a3184e33c91a87", 1], + ["58kul", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c4c48b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148b53f666cf707f35b113edb8faa6dd0213d1ad1f87", 1], + ["af9ne", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (P2SH20)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000085106c5c58b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91490c1cd4cf4cf0f1c972ea094ea3d994921e7083587", 1], + ["et934", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c651c68b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914955b780dcde5d4b3d7aed566fba07e0bb3c5065c87", 1], + ["7ey96", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c751c7bc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da445b913e3447b117a5452848695ce65c61d76987", 1], + ["k5w7d", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b512951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91416800cbe8ddc320a441e2e11c0ba98741682dad087", 1], + ["r056j", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851c951c98b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cce2a3bf93e117c6787d1283a3d32386b6df2c8b87", 1], + ["7smqv", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800ca00cabc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91414637fba5aac0495da5b4a1249be1c950e27f4bc87", 1], + ["d8jsx", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510851cb51cb8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91463c1f043dedba365b3d1f9b75c233a0ba01d90a787", 1], + ["56e9w", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cc00cc8b879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91485e3a291f9d3bca9fef2670c0aff48285233a58787", 1], + ["50yzt", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a510800cd00cdbc879169000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91493b1221c4c54b8c14c4d57e7ba66b8025c29bcc587", 1], + ["rgp33", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (P2SH20)", "<0>", "OP_INPUTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000040002c0870000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b438710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac"], + ["j3pwv", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (P2SH20)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c087000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 1], + ["7fzh2", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (P2SH20)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045202c087000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 2], + ["k28an", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (P2SH20)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045902c087000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914831f3ffbbc3ca255c066793fddd84dc36c531b4387", 9], + ["zttc4", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (P2SH20)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000602c18702c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b1182c31f4b3659924bc83505a2fb37667fda12387", 1], + ["039hr", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c05825588c18705825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148dbc087995eb473353236a1c0897a69aab5c48ce87", 1], + ["4zlny", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (P2SH20)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000120876825888c188c1870876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148640cbdd1c115e08f75d9082e58c4de400d1652887", 1], + ["j4509", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a02c18706825288abc187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148734854d785e3d6851ef94a0f362b94d4966540887", 1], + ["fwehg", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0388c187068253ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91475155507ce3aa062c54092f875a4ddc17e5980dc87", 1], + ["slkdz", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (P2SH20)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d03c1ab87088253ab88abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914468383d12181a33b9eb17b48a3b4f7792c17bd7487", 1], + ["wjg6k", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (P2SH20)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001703c1ab8706c188abc1ab870b8256ab88abc188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914767d9af37e4c295a64c4c6551c275c9c4313d90587", 1], + ["ufg8x", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (P2SH20)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91481397bc5b66a96ab5aa8e23636ed478dee9a845687", 1], + ["nxpe4", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working P2SH) (P2SH20)", "", "OP_ACTIVEBYTECODE OP_HASH160 OP_CAT OP_CAT OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d02a91409c1a901877e7ec0c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140e00addcc1b4ce2fb55d4de0189f0776842ce60a87", 1], + ["gvdq0", "Transaction inspection: OP_TXVERSION (version == 1) (P2SH20)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["w4xtx", "Transaction inspection: OP_TXVERSION (version == 2) (P2SH20)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["tgdk8", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (P2SH20)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c387000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 1], + ["yava7", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (P2SH20)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003d51373130302d627974652074782073697a65206d696e696d756d203132333435363738393031323334353637383930313233343536373839300375c387000000000100000000000000000a6a08766d625f7465737400000000", "01102700000000000017a914410488baf72ce08518ed6da0fda16f91b1907f8487"], + ["2exhq", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (P2SH20)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000045302c387000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 2], + ["tzw7t", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (P2SH20)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000045a02c387000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87", 9], + [ + "gk0x7", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (P2SH20)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "020000006500000000000000000000000000000000000000000000000000000000000000000000000005016502c3870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a9140b72c4598d26025b7d7c1d74702b2438ad140b5f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["ajcr7", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (P2SH20)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c487000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["2hcnx", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (P2SH20)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c487000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["qmaks", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (P2SH20)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c487000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["v380g", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (P2SH20)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005011402c487000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["wg5ru", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (P2SH20)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["hskrl", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (P2SH20)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045102c587000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["xhmrq", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (P2SH20)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045202c587000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["thcne", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (P2SH20)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000804ff64cd1d02c587000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["nantk", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (P2SH20)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000008040065cd1d02c587000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["msua4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (P2SH20)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c587000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["snd48", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (P2SH20)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c587000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f0c5021cdc15b9a7e8fc4165972875eca5b1568287", 1], + ["34j34", "Transaction inspection: OP_UTXOVALUE (10000) (P2SH20)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270002c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + ["6w9l3", "Transaction inspection: OP_UTXOVALUE (ignore result) (P2SH20)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91436e9c1e392c4a754ccf9e2521e46d63af0b5bb2587", 1], + ["5gx2e", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (P2SH20)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c675000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148ac9e62b390b0ca55959ba30d121a50fc62472b187", 1], + ["ucme6", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (P2SH20)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210275102c687000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187", 1], + [ + "lpa37", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (P2SH20)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000090340e201016402c6870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000017a914d497ca2f5c238fc820a85a9230c26815ebb851918740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["nu68c", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000090415cd5b070002c68700000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["lnseh", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000c070040075af075070002c687000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070017a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["7gyvw", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000d08ffffffffffffff7f0002c687000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f17a914d497ca2f5c238fc820a85a9230c26815ebb8519187"], + ["jqj53", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; P2SH20) (P2SH20)", "<0xa914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c17a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d870351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914baae9f614b7d4cde00a5c2ea454f59b5a3f91a2d87", 1], + ["2uchy", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (P2SH20)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac0300c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9148756772161ff4b37f5047eb8fec993a67bb25cbf87", 1], + ["6ml7d", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ad47e0f844f6bbc33df425e13d639da1be47320487", 1], + ["r6tsz", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c775000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a92cca806d7cd3f2219d30b8827879c35483cc1387", 1], + ["926rx", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs, standard transaction) (P2SH20)", " OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_EQUAL> OP_HASH160)> OP_EQUAL> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL> OP_HASH160)> OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <2> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <3> OP_UTXOBYTECODE OP_EQUAL", "02000000320000000000000000000000000000000000000000000000000000000000000000000000007017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca8717a914c2e604786e623e7b0cec3d37375c43ff212996968717a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb8717a9143c791e34d5366304e5474eb19abb415413314231870f00c788ab51c788ab52c788ab53c7870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a9143c791e34d5366304e5474eb19abb41541331423187102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["rgrps", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000300c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91442357ab9beeb0809abf286d2ecbbd047709f4ff887", 1], + ["p9ukh", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000252000000000000000000000000000000000000000000000000000000000000000000351c887000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587", 1], + ["hk7nq", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (P2SH20)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000252000000000000000000000000000000000000000000000000000000000000000010351c88700000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914befc51ace33c6bb022a8e3511a067d68ca7214b587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["xpk79", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9142852124534d57bd929d21b449e610ee22fe8746487", 1], + ["yutz9", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c875000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ff238384415a79cdc5115d0469e3fe1f8153b45e87", 1], + ["j9xf0", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c8750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91475ea38e01f33e889f00e72decfdc0cd8854f40b787102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["zmwmj", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000022012a5d531d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f758700000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a91421c219da675eae84da66fa2f4b9f70bff74b73fd87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["jj689", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (P2SH20)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914150150967a345cee132e10ed63ee8b2e2127183387", 1], + ["annu3", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c987000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287", 1], + ["sm9kp", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351c98700000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a9140a6e1fcd92c7ba63cea234457f771fc808bb265287102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["qmew2", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9144e84cbaea6f9b66166ea14eea76df537192c4cbd87", 1], + ["2ljft", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351c975000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a4726b6ab589e3bf19ac1628d97db9a9bc77517487", 1], + ["yv2hj", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352c9750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a9141ef1c56fca391fa18de57061d8184c057335523087102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["rtkyc", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300c9008851c951c98853c9885dc988012ac9870000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914a852b37c118384a3655d0a3c92af3bfa806466c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["vyy3e", "Transaction inspection: OP_INPUTBYTECODE (input 0) (P2SH20)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000006b004c68ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91450d51b25a7868fe6adf200440c53d0e0e6be9eb987", 1], + ["d5ul4", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20) (P2SH20)", " OP_INPUTBYTECODE OP_EQUALVERIFY <1>>", "OP_DUP OP_SIZE OP_SWAP OP_CAT OP_CODESEPARATOR OP_NIP OP_DUP OP_CAT OP_CODESEPARATOR <1> OP_INPUTBYTECODE OP_EQUALVERIFY <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c0d76827c7eab77767eab51ca88510d76827c7eab77767eab51ca8851000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914fd6a26edcde4ccca609c63dc5c6d7005cb725cb387", 1], + ["cz7ah", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in redeem bytecode has no effect (self, P2SH20, compare OP_UTXOBYTECODE) (P2SH20)", "<1>", "OP_INPUTBYTECODE <2> OP_SPLIT OP_CODESEPARATOR OP_HASH160 OP_SWAP OP_CAT OP_CAT OP_CODESEPARATOR <1> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_SPLIT OP_DROP <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000195117ca527faba902a9147c7e01877eab51c788517f75015187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146e426e71ad390256f8e7a2dd7b88b139bf73eb6e87", 1], + ["zp9gc", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b42626d4d54774b8be5bf423dbd422e21851914887", 1], + ["9maeh", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91429a5bf683d386c8f65dc5ccb8f22766fec8e787387", 1], + ["r93tx", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352ca750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a914266206a75755c70c126f777448e6a410391d637687102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["akjnr", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (P2SH20)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000370802002a0402002a870802000d0402000d870802000704020007870802000104020001871200ca00ca8851ca8857ca885dca88012aca870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914430f061cc80ff742b57e328bc3401c1a210e5d7b87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["3fuxn", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0802514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe047551ca75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b594c7385e40a368bdac6d1baf3e7a8af021fef887", 1], + ["ysc4e", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (P2SH20)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387", 1], + ["sgtuu", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (P2SH20)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000351cb87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87", 1], + ["9l0lg", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000005510351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["z0e7y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000300cb87ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914801aaa80ec28b0fd6d77d6b73862966aa3f54ba387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["2hpht", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17500cb87feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914d29718a7b62bfb7d0c07021acf51e64c5f60d0c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["nu30y", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (P2SH20)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000a05ffffffff000351cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "02000000000000000017a914be2e97456f4925c225f31fa3b24ea768eeedb36f87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["n9jyd", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (P2SH20)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05feffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["uyrhw", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (P2SH20)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000d05ffffffff000651b17551cb8700000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "02000000000000000017a914646442f4f60527faafba2066ea8faba7559018b987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["gtfha", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (P2SH20)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bdaf8ccc75208c9d548c1690337db42ae19a036487", 1], + ["a0s38", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (P2SH20)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510351cb75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914498874323743a9d189a4cea2e0f31ae18677376487", 1], + ["gq4nl", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (P2SH20)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000005510352cb750000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "03000000000000000017a91450e532f3db9ff10e68111e4afd7867a9b054c0d887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["rc9d3", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (P2SH20)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000018012a5d531300cb008851cb51cb8853cb885dcb88012acb870000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "32000000000000000017a914d4d1ce02ebaab2d5f8cda5c0acd1d89656596b4187102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["6tm5y", "Transaction inspection: OP_OUTPUTVALUE (output 0) (P2SH20)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005000300cc87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["r8w8x", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (P2SH20)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441220ce6fcca0aeef27e808bb730d1c3c371f06298e79fd0948911795308c9e0916f405ce7c8465c4a6c0969a95bc1d45c35d44ef834ca733b0ea50052fb8c2796c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070210270300cc870000000001102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b6488700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914bb44078864931a010fcae77e96a614a9cf11b64887", 1], + ["wy0q9", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cc75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9145a1dede50254d70a00eec28c70029401bf888efa87", 1], + ["xjk3x", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441087c36fb41c6dc2d8d9e370c3db4258bbc9da3b91405355e4c9e3c5480a4e88c917ad21d16b1f870ca92bf5a9ec6200b7c3a8d8fd5a0cafb6d6e78531ffa9d88c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cc750000000003102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587112700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587122700000000000017a91413213c90331d3a3c048adac557b350d38e7f47058700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91413213c90331d3a3c048adac557b350d38e7f470587", 1], + ["jjmth", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (P2SH20)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441376a3c3cf7345e31982bf5b85792d3b3da802d2c704b8d0b6244e6255b42a5a7895a605ce24ff626f0fcd02daa3ed451de70eb12f84ddc7d792a6442af7f435bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f023a27021d270217270211271200cc00cc8851cc8857cc885dcc88012acc870000000032102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87112700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87122700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87132700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87142700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87152700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87162700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87172700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87182700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87192700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c871f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87202700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87212700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87222700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87232700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87242700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87252700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87262700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87272700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87282700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87292700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c872f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87302700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87312700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87322700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87332700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87342700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87352700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87362700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87372700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87382700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87392700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873a2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873b2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873c2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873d2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873e2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c873f2700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87402700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87412700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91438539de526a0e63669558c9a1d5196cc21a0dd4c87", 1], + ["hfsgn", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (P2SH20)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441aa25ded491ef8724bcd372e0900d0a5ef3855495862b443948252c35e05b9a5c97b64f749f7c5dad84d0a4f1edb560da8bc147b003acff0f7117186fe6116050c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090415cd5b070002cc87000000000115cd5b070000000017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["3fp95", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (P2SH20)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441fcf93fb29e1777a54a66cb1b8282b693c70e857f520b1406a05072cd79c04fbb698bd4c81b112e1ebed63743aaaadb1fccc85f8ca6bc492c6c68afff34b365c5c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c070040075af075070002cc8700000000010040075af075070017a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["phwq6", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (P2SH20)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e2d18cd10452d690465bc66f516fc721f3f427c8855b8e735645d50a28c3c6e4efe07f81e2dc97ce535b6f09015e8057b0ebd780e196ea91dcc75154acd5b504c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d08ffffffffffffff7f0002cc870000000001ffffffffffffff7f17a914f51a2602ed47741ea17346ae934b89b8a693945b8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914f51a2602ed47741ea17346ae934b89b8a693945b87", 1], + ["d2ve9", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0a6a08766d625f746573740300cd87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["3wjnv", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (P2SH20)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006016a0300cd8700000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["jk2p8", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd75000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1], + ["5rg92", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (P2SH20)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411df6a8b086ca9f12ccc98419dd5c831b25bbb0142a8060312d85b6840e2082a594928d7d92a9e53cf595f52cbfb95afd2a2b760760b48bb9aa68af26dc233105c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510352cd750000000003102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787112700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787122700000000000017a914b71b0e470dfe912afd84f6185097078a0ff747778700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914b71b0e470dfe912afd84f6185097078a0ff7477787", 1], + ["v0pn5", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (P2SH20)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000020036a012a026a5d026a57026a511200cd00cd8851cd8857cd885dcd88012acd8700000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91497ab1496d1f9599b44ebfaa166acc0852f35524387", 1] +] diff --git a/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_valid.json b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_valid.json new file mode 100644 index 00000000..ffacefc7 --- /dev/null +++ b/src/lib/vmb-tests/generated/bch/bch_vmb_tests_2022_valid.json @@ -0,0 +1,275 @@ +[ + ["ste4l", "Basic push operations: OP_0 (A.K.A. OP_PUSHBYTES_0, OP_FALSE): zero is represented by an empty stack item (nonP2SH)", "OP_0", "OP_SIZE <0> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482008777", 1], + ["6dasr", "Basic push operations: OP_PUSHBYTES_1 (nonP2SH)", "OP_PUSHBYTES_1 0x00", "OP_SIZE <1> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482518777", 1], + ["52zmt", "Basic push operations: OP_PUSHBYTES_2 (nonP2SH)", "OP_PUSHBYTES_2 0x0000", "OP_SIZE <2> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003020000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482528777", 1], + ["p423x", "Basic push operations: OP_PUSHBYTES_3 (nonP2SH)", "OP_PUSHBYTES_3 0x000000", "OP_SIZE <3> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482538777", 1], + ["28vzk", "Basic push operations: OP_PUSHBYTES_4 (nonP2SH)", "OP_PUSHBYTES_4 0x00000000", "OP_SIZE <4> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000050400000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482548777", 1], + ["phylh", "Basic push operations: OP_PUSHBYTES_5 (nonP2SH)", "OP_PUSHBYTES_5 0x0000000000", "OP_SIZE <5> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006050000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482558777", 1], + ["duvaw", "Basic push operations: OP_PUSHBYTES_6 (nonP2SH)", "OP_PUSHBYTES_6 0x000000000000", "OP_SIZE <6> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000706000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482568777", 1], + ["htnez", "Basic push operations: OP_PUSHBYTES_7 (nonP2SH)", "OP_PUSHBYTES_7 0x00000000000000", "OP_SIZE <7> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000080700000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482578777", 1], + ["ycdq3", "Basic push operations: OP_PUSHBYTES_8 (nonP2SH)", "OP_PUSHBYTES_8 0x0000000000000000", "OP_SIZE <8> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009080000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482588777", 1], + ["c20q3", "Basic push operations: OP_PUSHBYTES_9 (nonP2SH)", "OP_PUSHBYTES_9 0x000000000000000000", "OP_SIZE <9> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a09000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482598777", 1], + ["mlstn", "Basic push operations: OP_PUSHBYTES_10 (nonP2SH)", "OP_PUSHBYTES_10 0x00000000000000000000", "OP_SIZE <10> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a00000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825a8777", 1], + ["jmjj2", "Basic push operations: OP_PUSHBYTES_11 (nonP2SH)", "OP_PUSHBYTES_11 0x0000000000000000000000", "OP_SIZE <11> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c0b0000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825b8777", 1], + ["960mz", "Basic push operations: OP_PUSHBYTES_12 (nonP2SH)", "OP_PUSHBYTES_12 0x000000000000000000000000", "OP_SIZE <12> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d0c000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825c8777", 1], + ["6w62r", "Basic push operations: OP_PUSHBYTES_13 (nonP2SH)", "OP_PUSHBYTES_13 0x00000000000000000000000000", "OP_SIZE <13> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000e0d00000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825d8777", 1], + ["qjm07", "Basic push operations: OP_PUSHBYTES_14 (nonP2SH)", "OP_PUSHBYTES_14 0x0000000000000000000000000000", "OP_SIZE <14> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000f0e0000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825e8777", 1], + ["q9xzq", "Basic push operations: OP_PUSHBYTES_15 (nonP2SH)", "OP_PUSHBYTES_15 0x000000000000000000000000000000", "OP_SIZE <15> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000100f000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004825f8777", 1], + ["fln49", "Basic push operations: OP_PUSHBYTES_16 (nonP2SH)", "OP_PUSHBYTES_16 0x00000000000000000000000000000000", "OP_SIZE <16> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000111000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000482608777", 1], + ["hajrl", "Basic push operations: OP_PUSHBYTES_17 (nonP2SH)", "OP_PUSHBYTES_17 0x0000000000000000000000000000000000", "OP_SIZE <17> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000012110000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201118777", 1], + ["e6h26", "Basic push operations: OP_PUSHBYTES_18 (nonP2SH)", "OP_PUSHBYTES_18 0x000000000000000000000000000000000000", "OP_SIZE <18> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001312000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201128777", 1], + ["0g9pf", "Basic push operations: OP_PUSHBYTES_19 (nonP2SH)", "OP_PUSHBYTES_19 0x00000000000000000000000000000000000000", "OP_SIZE <19> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000141300000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201138777", 1], + ["39hlr", "Basic push operations: OP_PUSHBYTES_20 (nonP2SH)", "OP_PUSHBYTES_20 0x0000000000000000000000000000000000000000", "OP_SIZE <20> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000015140000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201148777", 1], + ["qmfm4", "Basic push operations: OP_PUSHBYTES_21 (nonP2SH)", "OP_PUSHBYTES_21 0x000000000000000000000000000000000000000000", "OP_SIZE <21> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001615000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201158777", 1], + ["vqtm6", "Basic push operations: OP_PUSHBYTES_22 (nonP2SH)", "OP_PUSHBYTES_22 0x00000000000000000000000000000000000000000000", "OP_SIZE <22> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000171600000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201168777", 1], + ["gw4g0", "Basic push operations: OP_PUSHBYTES_23 (nonP2SH)", "OP_PUSHBYTES_23 0x0000000000000000000000000000000000000000000000", "OP_SIZE <23> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000018170000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201178777", 1], + ["y67he", "Basic push operations: OP_PUSHBYTES_24 (nonP2SH)", "OP_PUSHBYTES_24 0x000000000000000000000000000000000000000000000000", "OP_SIZE <24> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001918000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201188777", 1], + ["lad28", "Basic push operations: OP_PUSHBYTES_25 (nonP2SH)", "OP_PUSHBYTES_25 0x00000000000000000000000000000000000000000000000000", "OP_SIZE <25> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1900000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201198777", 1], + ["xe2g3", "Basic push operations: OP_PUSHBYTES_26 (nonP2SH)", "OP_PUSHBYTES_26 0x0000000000000000000000000000000000000000000000000000", "OP_SIZE <26> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001b1a0000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011a8777", 1], + ["30hyp", "Basic push operations: OP_PUSHBYTES_27 (nonP2SH)", "OP_PUSHBYTES_27 0x000000000000000000000000000000000000000000000000000000", "OP_SIZE <27> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001c1b000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011b8777", 1], + ["7qefv", "Basic push operations: OP_PUSHBYTES_28 (nonP2SH)", "OP_PUSHBYTES_28 0x00000000000000000000000000000000000000000000000000000000", "OP_SIZE <28> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001d1c00000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011c8777", 1], + ["004y8", "Basic push operations: OP_PUSHBYTES_29 (nonP2SH)", "OP_PUSHBYTES_29 0x0000000000000000000000000000000000000000000000000000000000", "OP_SIZE <29> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001e1d0000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011d8777", 1], + ["dxnpw", "Basic push operations: OP_PUSHBYTES_30 (nonP2SH)", "OP_PUSHBYTES_30 0x000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <30> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f1e000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011e8777", 1], + ["ydw6y", "Basic push operations: OP_PUSHBYTES_31 (nonP2SH)", "OP_PUSHBYTES_31 0x00000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <31> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000201f00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582011f8777", 1], + ["l4k5j", "Basic push operations: OP_PUSHBYTES_32 (nonP2SH)", "OP_PUSHBYTES_32 0x0000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <32> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201208777", 1], + ["8arx8", "Basic push operations: OP_PUSHBYTES_33 (nonP2SH)", "OP_PUSHBYTES_33 0x000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <33> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002221000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201218777", 1], + ["8wufw", "Basic push operations: OP_PUSHBYTES_34 (nonP2SH)", "OP_PUSHBYTES_34 0x00000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <34> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000232200000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201228777", 1], + ["ep6aw", "Basic push operations: OP_PUSHBYTES_35 (nonP2SH)", "OP_PUSHBYTES_35 0x0000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <35> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000024230000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201238777", 1], + ["lcm0g", "Basic push operations: OP_PUSHBYTES_36 (nonP2SH)", "OP_PUSHBYTES_36 0x000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <36> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002524000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201248777", 1], + ["m4c7x", "Basic push operations: OP_PUSHBYTES_37 (nonP2SH)", "OP_PUSHBYTES_37 0x00000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <37> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000262500000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201258777", 1], + ["ak572", "Basic push operations: OP_PUSHBYTES_38 (nonP2SH)", "OP_PUSHBYTES_38 0x0000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <38> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000027260000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201268777", 1], + ["q2a6l", "Basic push operations: OP_PUSHBYTES_39 (nonP2SH)", "OP_PUSHBYTES_39 0x000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <39> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002827000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201278777", 1], + ["5s8lk", "Basic push operations: OP_PUSHBYTES_40 (nonP2SH)", "OP_PUSHBYTES_40 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <40> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000292800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201288777", 1], + ["qf7mf", "Basic push operations: OP_PUSHBYTES_41 (nonP2SH)", "OP_PUSHBYTES_41 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <41> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002a290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201298777", 1], + ["dqx0m", "Basic push operations: OP_PUSHBYTES_42 (nonP2SH)", "OP_PUSHBYTES_42 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <42> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002b2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012a8777", 1], + ["2567w", "Basic push operations: OP_PUSHBYTES_43 (nonP2SH)", "OP_PUSHBYTES_43 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <43> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002c2b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012b8777", 1], + ["n8pnz", "Basic push operations: OP_PUSHBYTES_44 (nonP2SH)", "OP_PUSHBYTES_44 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <44> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002d2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012c8777", 1], + ["guywl", "Basic push operations: OP_PUSHBYTES_45 (nonP2SH)", "OP_PUSHBYTES_45 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <45> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002e2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012d8777", 1], + ["tmfdw", "Basic push operations: OP_PUSHBYTES_46 (nonP2SH)", "OP_PUSHBYTES_46 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <46> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000002f2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012e8777", 1], + ["2tlrz", "Basic push operations: OP_PUSHBYTES_47 (nonP2SH)", "OP_PUSHBYTES_47 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <47> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000302f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582012f8777", 1], + ["e8rsy", "Basic push operations: OP_PUSHBYTES_48 (nonP2SH)", "OP_PUSHBYTES_48 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <48> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201308777", 1], + ["rw33f", "Basic push operations: OP_PUSHBYTES_49 (nonP2SH)", "OP_PUSHBYTES_49 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <49> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000323100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201318777", 1], + ["xaena", "Basic push operations: OP_PUSHBYTES_50 (nonP2SH)", "OP_PUSHBYTES_50 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <50> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000033320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201328777", 1], + ["e3hnk", "Basic push operations: OP_PUSHBYTES_51 (nonP2SH)", "OP_PUSHBYTES_51 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <51> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201338777", 1], + ["fl60y", "Basic push operations: OP_PUSHBYTES_52 (nonP2SH)", "OP_PUSHBYTES_52 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <52> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000353400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201348777", 1], + ["9ndk8", "Basic push operations: OP_PUSHBYTES_53 (nonP2SH)", "OP_PUSHBYTES_53 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <53> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000036350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201358777", 1], + ["6f8pr", "Basic push operations: OP_PUSHBYTES_54 (nonP2SH)", "OP_PUSHBYTES_54 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <54> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003736000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201368777", 1], + ["ut5wh", "Basic push operations: OP_PUSHBYTES_55 (nonP2SH)", "OP_PUSHBYTES_55 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <55> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000383700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201378777", 1], + ["efkpj", "Basic push operations: OP_PUSHBYTES_56 (nonP2SH)", "OP_PUSHBYTES_56 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <56> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000039380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201388777", 1], + ["xj9r9", "Basic push operations: OP_PUSHBYTES_57 (nonP2SH)", "OP_PUSHBYTES_57 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <57> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003a39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201398777", 1], + ["lufsz", "Basic push operations: OP_PUSHBYTES_58 (nonP2SH)", "OP_PUSHBYTES_58 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <58> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003b3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013a8777", 1], + ["w25yd", "Basic push operations: OP_PUSHBYTES_59 (nonP2SH)", "OP_PUSHBYTES_59 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <59> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003c3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013b8777", 1], + ["tupvf", "Basic push operations: OP_PUSHBYTES_60 (nonP2SH)", "OP_PUSHBYTES_60 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <60> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003d3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013c8777", 1], + ["ykq09", "Basic push operations: OP_PUSHBYTES_61 (nonP2SH)", "OP_PUSHBYTES_61 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <61> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003e3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013d8777", 1], + ["62ylk", "Basic push operations: OP_PUSHBYTES_62 (nonP2SH)", "OP_PUSHBYTES_62 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <62> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000003f3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013e8777", 1], + ["tq0dz", "Basic push operations: OP_PUSHBYTES_63 (nonP2SH)", "OP_PUSHBYTES_63 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <63> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000403f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582013f8777", 1], + ["t7u5l", "Basic push operations: OP_PUSHBYTES_64 (nonP2SH)", "OP_PUSHBYTES_64 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <64> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201408777", 1], + ["dv38s", "Basic push operations: OP_PUSHBYTES_65 (nonP2SH)", "OP_PUSHBYTES_65 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <65> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000042410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201418777", 1], + ["mp674", "Basic push operations: OP_PUSHBYTES_66 (nonP2SH)", "OP_PUSHBYTES_66 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <66> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004342000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201428777", 1], + ["lljav", "Basic push operations: OP_PUSHBYTES_67 (nonP2SH)", "OP_PUSHBYTES_67 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <67> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000444300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201438777", 1], + ["x997y", "Basic push operations: OP_PUSHBYTES_68 (nonP2SH)", "OP_PUSHBYTES_68 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <68> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000045440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201448777", 1], + ["tuxjz", "Basic push operations: OP_PUSHBYTES_69 (nonP2SH)", "OP_PUSHBYTES_69 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <69> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201458777", 1], + ["t503j", "Basic push operations: OP_PUSHBYTES_70 (nonP2SH)", "OP_PUSHBYTES_70 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <70> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000474600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201468777", 1], + ["alt06", "Basic push operations: OP_PUSHBYTES_71 (nonP2SH)", "OP_PUSHBYTES_71 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <71> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000048470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201478777", 1], + ["y56mg", "Basic push operations: OP_PUSHBYTES_72 (nonP2SH)", "OP_PUSHBYTES_72 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <72> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004948000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201488777", 1], + ["wfr92", "Basic push operations: OP_PUSHBYTES_73 (nonP2SH)", "OP_PUSHBYTES_73 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <73> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004a4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000058201498777", 1], + ["xjn79", "Basic push operations: OP_PUSHBYTES_74 (nonP2SH)", "OP_PUSHBYTES_74 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <74> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004b4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014a8777", 1], + ["g0lhc", "Basic push operations: OP_PUSHBYTES_75 (nonP2SH)", "OP_PUSHBYTES_75 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "OP_SIZE <75> OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000004c4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000582014b8777", 1], + ["zun3v", "Push number operations (OP_1NEGATE-OP_16): OP_1NEGATE pushes 0x81. (nonP2SH)", "OP_1NEGATE", "<-1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000014f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007028100517f7587", 1], + ["4uaxt", "Push number operations (OP_1NEGATE-OP_16): OP_0 pushes an empty stack item. (nonP2SH)", "OP_0", "<0x00> OP_CAT <0x00> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000601007e010087", 1], + ["jrz8s", "Push number operations (OP_1NEGATE-OP_16): OP_1 pushes 0x01. (nonP2SH)", "OP_1", "<1 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020100517f7587", 1], + ["wzn30", "Push number operations (OP_1NEGATE-OP_16): OP_2 pushes 0x02. (nonP2SH)", "OP_2", "<2 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020200517f7587", 1], + ["ngjnw", "Push number operations (OP_1NEGATE-OP_16): OP_3 pushes 0x03. (nonP2SH)", "OP_3", "<3 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020300517f7587", 1], + ["r6nk5", "Push number operations (OP_1NEGATE-OP_16): OP_4 pushes 0x04. (nonP2SH)", "OP_4", "<4 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000154000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020400517f7587", 1], + ["l0pk8", "Push number operations (OP_1NEGATE-OP_16): OP_5 pushes 0x05. (nonP2SH)", "OP_5", "<5 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000155000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020500517f7587", 1], + ["2rg8n", "Push number operations (OP_1NEGATE-OP_16): OP_6 pushes 0x06. (nonP2SH)", "OP_6", "<6 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000156000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020600517f7587", 1], + ["k5xz6", "Push number operations (OP_1NEGATE-OP_16): OP_7 pushes 0x07. (nonP2SH)", "OP_7", "<7 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000157000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020700517f7587", 1], + ["qgjft", "Push number operations (OP_1NEGATE-OP_16): OP_8 pushes 0x08. (nonP2SH)", "OP_8", "<8 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000158000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020800517f7587", 1], + ["327xw", "Push number operations (OP_1NEGATE-OP_16): OP_9 pushes 0x09. (nonP2SH)", "OP_9", "<9 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000159000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020900517f7587", 1], + ["ek4x8", "Push number operations (OP_1NEGATE-OP_16): OP_10 pushes 0x0a. (nonP2SH)", "OP_10", "<10 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020a00517f7587", 1], + ["rrkvk", "Push number operations (OP_1NEGATE-OP_16): OP_11 pushes 0x0b. (nonP2SH)", "OP_11", "<11 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015b000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020b00517f7587", 1], + ["fcwkn", "Push number operations (OP_1NEGATE-OP_16): OP_12 pushes 0x0c. (nonP2SH)", "OP_12", "<12 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015c000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020c00517f7587", 1], + ["r55a5", "Push number operations (OP_1NEGATE-OP_16): OP_13 pushes 0x0d. (nonP2SH)", "OP_13", "<13 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015d000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020d00517f7587", 1], + ["plw4j", "Push number operations (OP_1NEGATE-OP_16): OP_14 pushes 0x0e. (nonP2SH)", "OP_14", "<14 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015e000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020e00517f7587", 1], + ["xwch4", "Push number operations (OP_1NEGATE-OP_16): OP_15 pushes 0x0f. (nonP2SH)", "OP_15", "<15 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015f000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007020f00517f7587", 1], + ["4wkp7", "Push number operations (OP_1NEGATE-OP_16): OP_16 pushes 0x10. (nonP2SH)", "OP_16", "<16 0x00> <1> OP_SPLIT OP_DROP OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000160000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000007021000517f7587", 1], + ["j4u37", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (nonP2SH)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000400635068000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["sywcn", "Standard transaction inputs may only include push operations: OP_RESERVED is valid if not executed (and is standard in unlocking bytecode, but OP_IF/OP_ENDIF are not) (P2SH20)", "<0> OP_IF OP_RESERVED OP_ENDIF", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000006006350680151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["3p8ht", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (nonP2SH)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000161000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000151", 1], + ["2nth6", "Standard transaction inputs may only include push operations: OP_NOP is non-standard in unlocking bytecode (P2SH20)", "OP_NOP", "<1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003610151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87", 1], + ["j9jae", "Disabled/failing operations: OP_RESERVED is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463506851", 1], + ["4as4l", "Disabled/failing operations: OP_VER is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_VER OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463626851", 1], + ["4h0af", "Disabled/failing operations: OP_RETURN is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RETURN OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004636a6851", 1], + ["3xwla", "Disabled/failing operations: OP_RESERVED1 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED1 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000463896851", 1], + ["36ylw", "Disabled/failing operations: OP_RESERVED2 is standard if not executed (nonP2SH)", "<0>", "OP_IF OP_RESERVED2 OP_ENDIF <1>", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004638a6851", 1], + ["lz2vp", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (nonP2SH)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b0", 1], + ["e9r4g", "OP_NOP1-OP_NOP10 expansion range: OP_NOP1 is non-standard (P2SH20)", "<1>", "OP_NOP1", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b0000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914198821d0c372b25f4d25d71171164ac5a3a0f20d87", 1], + ["u9jep", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (nonP2SH)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b3", 1], + ["7ajt0", "OP_NOP1-OP_NOP10 expansion range: OP_NOP4 is non-standard (P2SH20)", "<1>", "OP_NOP4", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b3000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914eb9fdedf708d6110ac11e3c10f5bf0e3c59a666d87", 1], + ["73c2h", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (nonP2SH)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b4", 1], + ["rkm3y", "OP_NOP1-OP_NOP10 expansion range: OP_NOP5 is non-standard (P2SH20)", "<1>", "OP_NOP5", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b4000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914a63f6475f705155c509056cc131bd9dcbce228ef87", 1], + ["hh7du", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (nonP2SH)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b5", 1], + ["ay989", "OP_NOP1-OP_NOP10 expansion range: OP_NOP6 is non-standard (P2SH20)", "<1>", "OP_NOP6", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b5000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914703b3c7dd955ecad9d283f9ee6baddb33b11795d87", 1], + ["k87ru", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (nonP2SH)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b6", 1], + ["gk9md", "OP_NOP1-OP_NOP10 expansion range: OP_NOP7 is non-standard (P2SH20)", "<1>", "OP_NOP7", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b6000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914cf12535fc1a7c0040b019a516904cbe2737785f387", 1], + ["9rwt7", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (nonP2SH)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b7", 1], + ["wxp8r", "OP_NOP1-OP_NOP10 expansion range: OP_NOP8 is non-standard (P2SH20)", "<1>", "OP_NOP8", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b7000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9146fd2ec5df0f6a6534d1cb0be74c3a1a9323681a087", 1], + ["ak0rz", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (nonP2SH)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b8", 1], + ["hqheq", "OP_NOP1-OP_NOP10 expansion range: OP_NOP9 is non-standard (P2SH20)", "<1>", "OP_NOP9", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b8000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9143e8ca1d58727effeb462d1d2dd1b17bdc89c133d87", 1], + ["7a748", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (nonP2SH)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000001b9", 1], + ["gyuak", "OP_NOP1-OP_NOP10 expansion range: OP_NOP10 is non-standard (P2SH20)", "<1>", "OP_NOP10", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000035101b9000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91415727299b05b45fdaf9ac9ecf7565cfe27c3e56787", 1], + ["tqlk6", "Conditionally executed operations: OP_INPUTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_INPUTINDEX OP_ENDIF OP_INPUTINDEX OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c068c0c087", 1], + ["seaka", "Conditionally executed operations: OP_ACTIVEBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_ACTIVEBYTECODE OP_ENDIF OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c168c1c187", 1], + ["apa8e", "Conditionally executed operations: OP_TXVERSION is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXVERSION OP_ENDIF OP_TXVERSION OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c268c2c287", 1], + ["mzu8u", "Conditionally executed operations: OP_TXINPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXINPUTCOUNT OP_ENDIF OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c368c3c387", 1], + ["zw3pl", "Conditionally executed operations: OP_TXOUTPUTCOUNT is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXOUTPUTCOUNT OP_ENDIF OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c468c4c487", 1], + ["gsqxz", "Conditionally executed operations: OP_TXLOCKTIME is conditionally executed (nonP2SH)", "<0>", "OP_IF OP_TXLOCKTIME OP_ENDIF OP_TXLOCKTIME OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000663c568c5c587", 1], + ["ldy8s", "Conditionally executed operations: OP_UTXOVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOVALUE OP_ENDIF <0> OP_UTXOVALUE <0> OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c66800c600c687", 1], + ["3hy92", "Conditionally executed operations: OP_UTXOBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_UTXOBYTECODE OP_ENDIF <0> OP_UTXOBYTECODE <0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c76800c700c787", 1], + ["e78pl", "Conditionally executed operations: OP_OUTPOINTTXHASH is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTTXHASH OP_ENDIF <0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c86800c800c887", 1], + ["x2wdc", "Conditionally executed operations: OP_OUTPOINTINDEX is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPOINTINDEX OP_ENDIF <0> OP_OUTPOINTINDEX <0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300c96800c900c987", 1], + ["uduf8", "Conditionally executed operations: OP_INPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTBYTECODE OP_ENDIF <0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300ca6800ca00ca87", 1], + ["qxn8m", "Conditionally executed operations: OP_INPUTSEQUENCENUMBER is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_INPUTSEQUENCENUMBER OP_ENDIF <0> OP_INPUTSEQUENCENUMBER <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cb6800cb00cb87", 1], + ["urj42", "Conditionally executed operations: OP_OUTPUTVALUE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTVALUE OP_ENDIF <0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cc6800cc00cc87", 1], + ["3emly", "Conditionally executed operations: OP_OUTPUTBYTECODE is conditionally executed (nonP2SH)", "<0>", "OP_IF <0> OP_OUTPUTBYTECODE OP_ENDIF <0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000096300cd6800cd00cd87", 1], + ["8gajz", "Operations copy by value: each OP_INPUTINDEX pushes an independent stack item (nonP2SH)", "<1>", "OP_INPUTINDEX OP_INPUTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c0c08b879169", 1], + ["330v3", "Operations copy by value: each OP_ACTIVEBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "OP_ACTIVEBYTECODE OP_ACTIVEBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c1c1bc879169", 1], + ["sl8fe", "Operations copy by value: each OP_TXVERSION pushes an independent stack item (nonP2SH)", "<1>", "OP_TXVERSION OP_TXVERSION OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c2c28b879169", 1], + ["k06h0", "Operations copy by value: each OP_TXINPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXINPUTCOUNT OP_TXINPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c3c38b879169", 1], + ["va8j0", "Operations copy by value: each OP_TXOUTPUTCOUNT pushes an independent stack item (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_TXOUTPUTCOUNT OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c4c48b879169", 1], + ["xe5xs", "Operations copy by value: each OP_TXLOCKTIME pushes an independent stack item (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_TXLOCKTIME OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006c5c58b879169", 1], + ["scmsx", "Operations copy by value: each OP_UTXOVALUE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOVALUE <1> OP_UTXOVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c651c68b879169", 1], + ["u4e5e", "Operations copy by value: each OP_UTXOBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE <1> OP_UTXOBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c751c7bc879169", 1], + ["t5m2t", "Operations copy by value: each OP_OUTPOINTTXHASH pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH <0xf00000000000000000000000000000000000000000000000000000000000000f> OP_XOR OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000002951c851c820f00000000000000000000000000000000000000000000000000000000000000f86879169", 1], + ["z8rgw", "Operations copy by value: each OP_OUTPOINTINDEX pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851c951c98b879169", 1], + ["y68ar", "Operations copy by value: each OP_INPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800ca00cabc879169", 1], + ["jg8pe", "Operations copy by value: each OP_INPUTSEQUENCENUMBER pushes an independent stack item (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000851cb51cb8b879169", 1], + ["entgm", "Operations copy by value: each OP_OUTPUTVALUE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_1ADD OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cc00cc8b879169", 1], + ["0vzkx", "Operations copy by value: each OP_OUTPUTBYTECODE pushes an independent stack item (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_REVERSEBYTES OP_EQUAL OP_NOT OP_VERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000800cd00cdbc879169", 1], + ["ex3vn", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (0) (nonP2SH)", "<0>", "OP_INPUTINDEX OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000100000000000000000a6a08766d625f7465737400000000", "02102700000000000002c08710270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac"], + ["njett", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (1) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 1], + ["sedjh", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (2) (nonP2SH)", "<2>", "OP_INPUTINDEX OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000152000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 2], + ["zvwad", "Transaction inspection: OP_INPUTINDEX returns the index of the input currently being evaluated (9) (nonP2SH)", "<9>", "OP_INPUTINDEX OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000090000000159000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c087", 9], + ["uc6pt", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (nonP2SH)", "", "OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c187", 1], + ["lv70c", "Transaction inspection: OP_ACTIVEBYTECODE returns the bytecode currently being evaluated (check size) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_SIZE <5> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605825588c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000005825588c187", 1], + ["rtmne", "Transaction inspection: OP_ACTIVEBYTECODE returns the same bytecode each time (without OP_CODESEPARATOR) (nonP2SH)", " OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL>", "OP_DUP OP_SIZE <8> OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090876825888c188c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000876825888c188c187", 1], + ["hskmq", "Transaction inspection: OP_ACTIVEBYTECODE respects OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <2> OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000302c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000006825288abc187", 1], + ["f6px7", "Transaction inspection: OP_ACTIVEBYTECODE respects a single OP_CODESEPARATOR (includes the OP_EQUALVERIFY) (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040388c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000068253ab88c187", 1], + ["y2w24", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (nonP2SH)", "", "OP_SIZE <3> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000403c1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000088253ab88abc1ab87", 1], + ["mfzua", "Transaction inspection: OP_ACTIVEBYTECODE returns only the bytecode after the last executed OP_CODESEPARATOR (two OP_ACTIVEBYTECODEs) (nonP2SH)", " ", "OP_SIZE <6> OP_CODESEPARATOR OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b03c1ab8706c188abc1ab87000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000b8256ab88abc188abc1ab87", 1], + ["5xege", "Transaction inspection: OP_ACTIVEBYTECODE works before and after multiple OP_CODESEPARATORs (nonP2SH)", " ", "OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR OP_ACTIVEBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY OP_ACTIVEBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001f0388c18705c1ab88c18708c188abc1ab88c1870bc188abc188abc1ab88c187000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000bc188abc188abc1ab88c187", 1], + ["346js", "Transaction inspection: \"OP_INPUTINDEX OP_UTXOBYTECODE\" and \"OP_ACTIVEBYTECODE\" differ in P2SH contracts (working nonP2SH) (nonP2SH)", "<1>", "OP_INPUTINDEX OP_UTXOBYTECODE OP_ACTIVEBYTECODE OP_EQUALVERIFY", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004c0c7c188", 1], + ["5kcwm", "Transaction inspection: OP_TXVERSION (version == 0) (nonP2SH)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["76sru", "Transaction inspection: OP_TXVERSION (version == 0) (P2SH20)", "<0>", "OP_TXVERSION OP_EQUAL", "000000000200000000000000000000000000000000000000000000000000000000000000000000000064416f5a01e81fff4d6b1f4e4004e235174ddcfea9e053a2bf9e4d4f4893b516d4fc0afd29bcc6ce940e82bb9e1c443c7c13e1659f9fa1c19f7df004133f2a7822fac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["22j8j", "Transaction inspection: OP_TXVERSION (version == 1) (nonP2SH)", "<1>", "OP_TXVERSION OP_EQUAL", "01000000020000000000000000000000000000000000000000000000000000000000000000000000006441ea9bbff42b9bbe48ebc29222638e21802ae824058b178235e380fc7f1e533c917b0bcd5698bea0a7a53b5bd73094e5276504557770d379908dddaf771ef48e41c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["4s00e", "Transaction inspection: OP_TXVERSION (version == 2) (nonP2SH)", "<2>", "OP_TXVERSION OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["274ra", "Transaction inspection: OP_TXVERSION (version == 3) (nonP2SH)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["mxsfm", "Transaction inspection: OP_TXVERSION (version == 3) (P2SH20)", "<3>", "OP_TXVERSION OP_EQUAL", "030000000200000000000000000000000000000000000000000000000000000000000000000000000064417ffe58222de1d605354914d4e9debc47da844251397c9681633a4e66401dd4f4205ffe6428511ddeacef1e027402dd4e89d452232c07c977fbd07f45e7ebedb7c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000045302c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["a7ywg", "Transaction inspection: OP_TXVERSION (version == 123456) (nonP2SH)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040340e201000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["fp07h", "Transaction inspection: OP_TXVERSION (version == 123456) (P2SH20)", "<123456>", "OP_TXVERSION OP_EQUAL", "40e2010002000000000000000000000000000000000000000000000000000000000000000000000000644162a434b980cf123adaa8a90b4c22faa816d6d542e5b8b683f7819393343525114fdbd4866948b22e9d519d649a338b4849e7c199da713aab7a852f36178f096ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000070340e20102c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["hfwul", "Transaction inspection: OP_TXVERSION (version == 4294967294) (nonP2SH)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["csz4l", "Transaction inspection: OP_TXVERSION (version == 4294967294) (P2SH20)", "<4294967294>", "OP_TXVERSION OP_EQUAL", "feffffff020000000000000000000000000000000000000000000000000000000000000000000000006441bf6747eb846d1705e812c43055288250cb14d4a813d66ae5cdfa8c259554936b0f53b6c15f57c9b39f290c4323d772527a7ccf5affddf3f40af6ffda8469c4b0c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905feffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["dyax6", "Transaction inspection: OP_TXVERSION (version == 4294967295) (nonP2SH)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c287", 1], + ["prrm7", "Transaction inspection: OP_TXVERSION (version == 4294967295) (P2SH20)", "<4294967295>", "OP_TXVERSION OP_EQUAL", "ffffffff0200000000000000000000000000000000000000000000000000000000000000000000000064416235f49f23bdbc17579517711d744b16bfc434d3a1b4529c34ed4d7ab711f5ddc6e9c83fe27bff2a6c777bbc8da3d068d815966467693a22f43e74362482c48cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000905ffffffff0002c287000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a91428f5cb65f6a5e44eaeb62a49cd2df5402e61e4dd87", 1], + ["akydk", "Transaction inspection: OP_TXINPUTCOUNT (2 inputs) (nonP2SH)", "<2>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 1], + ["fwh5z", "Transaction inspection: OP_TXINPUTCOUNT (1 input) (nonP2SH)", "<1> <\"100-byte tx size minimum 123456789012345678901234567890\">", "OP_DROP OP_TXINPUTCOUNT OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000003951373130302d627974652074782073697a65206d696e696d756d20313233343536373839303132333435363738393031323334353637383930000000000100000000000000000a6a08766d625f7465737400000000", "0110270000000000000375c387"], + ["49y82", "Transaction inspection: OP_TXINPUTCOUNT (3 inputs) (nonP2SH)", "<3>", "OP_TXINPUTCOUNT OP_EQUAL", "02000000030000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000020000000153000000000100000000000000000a6a08766d625f7465737400000000", "0310270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 2], + ["hxyj3", "Transaction inspection: OP_TXINPUTCOUNT (10 inputs) (nonP2SH)", "<10>", "OP_TXINPUTCOUNT OP_EQUAL", "020000000a0000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000064410e5f2ae8a6a74b0534d405a83e8d2ee91e153c7942ed9f75530a8e4b453a89ab7fd8450f7bf3cfaff911406e6d1f848c8720cc0ad29e732d8862959df2920c04c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000002000000644141e9ca5c71b4a32c6fb4395dfc2660af50d8569de68ae95f0c512f5211a70e9a8a98506693e0975b3f4dcfb961029d31befdb2b3b5b9c54ec4db58addcab4b9dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000003000000644100452820c60a735233d434af457e414e0107f3d58db29893f84a35d222517fb6aac8a440f63ea6beacbd2fc8fd45b8af38c5a1e9192d293af39d89db02a86539c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000400000064411c803b3e3d5a097385816d5083b9c5fcdb3f6dd96f9fbf43e8deee5eb8efb041544fe7e1937f1949beac4ce3d89b75c9026da0a1df0c2a564a8a52c14eacf534c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000005000000644112248d25bb0ebcdd3d75cad972cfae1acd564e40023e7767f1d4b05d7377fea909dab3cd60b6bb8bda006f6a32fe07392a74a7d3133e4325022e52f76d1c991cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000060000006441551c676956b6407382a5ec0cd4b9b73ec117b6f79107df41b96df75ae80ecbc9e3119dbcd5c127d5687c8cc5070399a65d3860d737060458e402cb20d7a06361c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000070000006441bd3fbc619dadd52f4d3e65a17ceb983a809b2906c7448e83d119bb5a2ed9b1207df9fb5bb9206843c69f71dd373163d735798f369f35ce2db78cec188f258a8fc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000080000006441a5410b024e54589a9ea55a78c33734de4944e30c6027baf7b1a8d4a2ba561c6198f2e730cce0ca6e8c52dbe22bac7e2ebdf6cf22096c89cbc00bd45ec274b01cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000009000000015a000000000100000000000000000a6a08766d625f7465737400000000", "0a10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c387", 9], + [ + "dr4g8", + "Transaction inspection: OP_TXINPUTCOUNT (101 inputs) (nonP2SH)", + "<101>", + "OP_TXINPUTCOUNT OP_EQUAL", + "02000000650000000000000000000000000000000000000000000000000000000000000000000000000201650000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c387102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["9vegm", "Transaction inspection: OP_TXOUTPUTCOUNT (1 output) (nonP2SH)", "<1>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["pysvy", "Transaction inspection: OP_TXOUTPUTCOUNT (2 outputs) (nonP2SH)", "<2>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000200000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["a6s0u", "Transaction inspection: OP_TXOUTPUTCOUNT (3 outputs) (nonP2SH)", "<3>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000153000000000300000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["5953j", "Transaction inspection: OP_TXOUTPUTCOUNT (20 outputs) (nonP2SH)", "<20>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020114000000001400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["al69w", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (nonP2SH)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000020164000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c487", 1], + ["jyvyq", "Transaction inspection: OP_TXOUTPUTCOUNT (100 outputs; non-standard beyond per-transaction OP_RETURN data limit) (P2SH20)", "<100>", "OP_TXOUTPUTCOUNT OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005016402c487000000006400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a9141b37089de91c9a16ae68113c213bf279be3c33e987", 1], + ["dekhm", "Transaction inspection: OP_TXLOCKTIME (locktime == 0) (nonP2SH)", "<0>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["p3fed", "Transaction inspection: OP_TXLOCKTIME (locktime == 1) (nonP2SH)", "<1>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441543741849e0dcc4be8fa93b2aab03ae587465fa28f8b80fa365a069309b6a6c3b5747c9e25b1310bb451be056a7a3a5b9f9e874d5f8071f63f9760c93169bb9ec32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737401000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["60fqf", "Transaction inspection: OP_TXLOCKTIME (locktime == 2) (nonP2SH)", "<2>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441313129b2271f8e5baf24d416baa3d5cf4e282603482ea27eb3edbbede0323f8cfa05925c4fffa9888cf298d027279a3120411d36cfdfb01dbdb1eb9999e277b8c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000152000000000100000000000000000a6a08766d625f7465737402000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["2cjpp", "Transaction inspection: OP_TXLOCKTIME (locktime == 499999999, the maximum block height) (nonP2SH)", "<499_999_999>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a7f027cb85374f52e8da8a9055811f1be1b1534957381e9e9e8b66f1f5a832d7f36c1e3d06466128310f2d1c381768f7e7e07c75c0c06ddd2313ea32667e9e6cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000504ff64cd1d000000000100000000000000000a6a08766d625f74657374ff64cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["62v09", "Transaction inspection: OP_TXLOCKTIME (locktime == 500000000, the minimum UNIX timestamp) (nonP2SH)", "<500_000_000>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441925ffc1ebf1560a85ef2c7990132973ffb04479633b60cafabf5da5e9927bff9ad1b2f2008fa79554fd33049069045e48c7c1a50fa337c745a9554fa317e1f91c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005040065cd1d000000000100000000000000000a6a08766d625f746573740065cd1d", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["c59cv", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967294) (nonP2SH)", "<4_294_967_294>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441ce3f12bce33c7148e5b15085bc463db5574c7b13ac1dec5f3c53aca6a7244220b0e4d607c4ff8b1ce55227e63b9cf923c74739356674f128503958616497fda4c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605feffffff00000000000100000000000000000a6a08766d625f74657374feffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["wt8a4", "Transaction inspection: OP_TXLOCKTIME (locktime == 4294967295) (nonP2SH)", "<4_294_967_295>", "OP_TXLOCKTIME OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441b7f6b12dfa68a1487af233ce927462ded7fa98b7926b263fe5bd7de80f58085ff6a58bd28e43decb3a38718d166afab647b664b880915d982a524511e188801bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000605ffffffff00000000000100000000000000000a6a08766d625f74657374ffffffff", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c587", 1], + ["apasg", "Transaction inspection: OP_UTXOVALUE (10000) (nonP2SH)", "<10_000> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102700000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + ["y63fa", "Transaction inspection: OP_UTXOVALUE (ignore result) (nonP2SH)", "<1>", "<0> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c675", 1], + ["j5h3j", "Transaction inspection: OP_UTXOVALUE (ignore result, index 1) (nonP2SH)", "<1>", "<1> OP_UTXOVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c675", 1], + ["dlaxg", "Transaction inspection: OP_UTXOVALUE (10000; input 1) (nonP2SH)", "<10_000> <1>", "OP_UTXOVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000402102751000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002c687", 1], + [ + "yedea", + "Transaction inspection: OP_UTXOVALUE (123456; input 101) (nonP2SH)", + "<123_456> <100>", + "OP_UTXOVALUE OP_EQUAL", + "0200000065000000000000000000000000000000000000000000000000000000000000000000000000060340e20101640000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f000000025100000000000000000000000000000000000000000000000000000000000000000000000000300000000251000000000000000000000000000000000000000000000000000000000000000000000000003100000002510000000000000000000000000000000000000000000000000000000000000000000000000032000000025100000000000000000000000000000000000000000000000000000000000000000000000000330000000251000000000000000000000000000000000000000000000000000000000000000000000000003400000002510000000000000000000000000000000000000000000000000000000000000000000000000035000000025100000000000000000000000000000000000000000000000000000000000000000000000000360000000251000000000000000000000000000000000000000000000000000000000000000000000000003700000002510000000000000000000000000000000000000000000000000000000000000000000000000038000000025100000000000000000000000000000000000000000000000000000000000000000000000000390000000251000000000000000000000000000000000000000000000000000000000000000000000000003a0000000251000000000000000000000000000000000000000000000000000000000000000000000000003b0000000251000000000000000000000000000000000000000000000000000000000000000000000000003c0000000251000000000000000000000000000000000000000000000000000000000000000000000000003d0000000251000000000000000000000000000000000000000000000000000000000000000000000000003e0000000251000000000000000000000000000000000000000000000000000000000000000000000000003f000000025100000000000000000000000000000000000000000000000000000000000000000000000000400000000251000000000000000000000000000000000000000000000000000000000000000000000000004100000002510000000000000000000000000000000000000000000000000000000000000000000000000042000000025100000000000000000000000000000000000000000000000000000000000000000000000000430000000251000000000000000000000000000000000000000000000000000000000000000000000000004400000002510000000000000000000000000000000000000000000000000000000000000000000000000045000000025100000000000000000000000000000000000000000000000000000000000000000000000000460000000251000000000000000000000000000000000000000000000000000000000000000000000000004700000002510000000000000000000000000000000000000000000000000000000000000000000000000048000000025100000000000000000000000000000000000000000000000000000000000000000000000000490000000251000000000000000000000000000000000000000000000000000000000000000000000000004a0000000251000000000000000000000000000000000000000000000000000000000000000000000000004b0000000251000000000000000000000000000000000000000000000000000000000000000000000000004c0000000251000000000000000000000000000000000000000000000000000000000000000000000000004d0000000251000000000000000000000000000000000000000000000000000000000000000000000000004e0000000251000000000000000000000000000000000000000000000000000000000000000000000000004f000000025100000000000000000000000000000000000000000000000000000000000000000000000000500000000251000000000000000000000000000000000000000000000000000000000000000000000000005100000002510000000000000000000000000000000000000000000000000000000000000000000000000052000000025100000000000000000000000000000000000000000000000000000000000000000000000000530000000251000000000000000000000000000000000000000000000000000000000000000000000000005400000002510000000000000000000000000000000000000000000000000000000000000000000000000055000000025100000000000000000000000000000000000000000000000000000000000000000000000000560000000251000000000000000000000000000000000000000000000000000000000000000000000000005700000002510000000000000000000000000000000000000000000000000000000000000000000000000058000000025100000000000000000000000000000000000000000000000000000000000000000000000000590000000251000000000000000000000000000000000000000000000000000000000000000000000000005a0000000251000000000000000000000000000000000000000000000000000000000000000000000000005b0000000251000000000000000000000000000000000000000000000000000000000000000000000000005c0000000251000000000000000000000000000000000000000000000000000000000000000000000000005d0000000251000000000000000000000000000000000000000000000000000000000000000000000000005e0000000251000000000000000000000000000000000000000000000000000000000000000000000000005f0000000251000000000000000000000000000000000000000000000000000000000000000000000000006000000002510000000000000000000000000000000000000000000000000000000000000000000000000061000000025100000000000000000000000000000000000000000000000000000000000000000000000000620000000251000000000000000000000000000000000000000000000000000000000000000000000000006300000002510000000000000000000000000000000000000000000000000000000000000000000000000064000000025100000000000100000000000000000a6a08766d625f7465737400000000", + "65000000000000000002c68740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb8740e201000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87" + ], + ["wspfd", "Transaction inspection: OP_UTXOVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_UTXOVALUE OP_EQUAL", "0200000001000000000000000000000000000000000000000000000000000000000000000000000000060415cd5b070000000000010000000000000000226a203130302d627974652074782073697a65206d696e696d756d203132333435363700000000", "0115cd5b070000000002c687"], + ["e2mjt", "Transaction inspection: OP_UTXOVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_UTXOVALUE OP_EQUAL", "020000000100000000000000000000000000000000000000000000000000000000000000000000000009070040075af0750700000000000100000000000000001f6a1d3130302d627974652074782073697a65206d696e696d756d203132333400000000", "010040075af075070002c687"], + ["uh9nd", "Transaction inspection: OP_UTXOVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_UTXOVALUE OP_EQUAL", "02000000010000000000000000000000000000000000000000000000000000000000000000000000000a08ffffffffffffff7f00000000000100000000000000001e6a1c3130302d627974652074782073697a65206d696e696d756d2031323300000000", "01ffffffffffffff7f02c687"], + ["j33pn", "Transaction inspection: OP_UTXOBYTECODE (<<1> OP_UTXOBYTECODE OP_EQUAL>; nonP2SH) (nonP2SH)", "<<1> OP_UTXOBYTECODE OP_EQUAL>", "<1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040351c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c787", 1], + ["fgxup", "Transaction inspection: OP_UTXOBYTECODE (; input 0) (nonP2SH)", "<0x76a91460011c6bf3f1dd98cff576437b9d85de780f497488ac>", "<0> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000001a1976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c787", 1], + ["7wqmv", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c775", 1], + ["08c02", "Transaction inspection: OP_UTXOBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c775", 1], + ["aq6sp", "Transaction inspection: OP_UTXOBYTECODE (maximum size UTXO bytecode) (nonP2SH)", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c787", 1], + ["ezh0a", "Transaction inspection: OP_UTXOBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff00> OP_DROP <1> OP_UTXOBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd08024d0102000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff007551c775", 1], + ["790ux", "Transaction inspection: multiple OP_UTXOBYTECODEs, OP_CODESEPARATOR has no effect (50 inputs) (nonP2SH)", "<<0x00 42> OP_EQUAL> <<0x00 13> OP_EQUAL> <<0x00 7> OP_EQUAL> <<0x00 3> OP_EQUAL> <<0x00 2> OP_EQUAL> <<0x00 1> OP_EQUAL> <<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL>", "<0> OP_UTXOBYTECODE OP_EQUALVERIFY <1> OP_CODESEPARATOR OP_UTXOBYTECODE OP_EQUALVERIFY <2> OP_UTXOBYTECODE OP_EQUALVERIFY <3> OP_UTXOBYTECODE OP_CODESEPARATOR OP_EQUALVERIFY <7> OP_UTXOBYTECODE OP_EQUALVERIFY <13> OP_UTXOBYTECODE OP_EQUALVERIFY OP_CODESEPARATOR <42> OP_UTXOBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000380402002a870402000d8704020007870402000387040200028704020001871900c78851abc78852c78853c7ab8857c7885dc788ab012ac7870000000000000000000000000000000000000000000000000000000000000000000000000100000003020001000000000000000000000000000000000000000000000000000000000000000000000000020000000302000200000000000000000000000000000000000000000000000000000000000000000000000003000000030200030000000000000000000000000000000000000000000000000000000000000000000000000400000003020004000000000000000000000000000000000000000000000000000000000000000000000000050000000302000500000000000000000000000000000000000000000000000000000000000000000000000006000000030200060000000000000000000000000000000000000000000000000000000000000000000000000700000003020007000000000000000000000000000000000000000000000000000000000000000000000000080000000302000800000000000000000000000000000000000000000000000000000000000000000000000009000000030200090000000000000000000000000000000000000000000000000000000000000000000000000a0000000302000a0000000000000000000000000000000000000000000000000000000000000000000000000b0000000302000b0000000000000000000000000000000000000000000000000000000000000000000000000c0000000302000c0000000000000000000000000000000000000000000000000000000000000000000000000d0000000302000d0000000000000000000000000000000000000000000000000000000000000000000000000e0000000302000e0000000000000000000000000000000000000000000000000000000000000000000000000f0000000302000f00000000000000000000000000000000000000000000000000000000000000000000000010000000030200100000000000000000000000000000000000000000000000000000000000000000000000001100000003020011000000000000000000000000000000000000000000000000000000000000000000000000120000000302001200000000000000000000000000000000000000000000000000000000000000000000000013000000030200130000000000000000000000000000000000000000000000000000000000000000000000001400000003020014000000000000000000000000000000000000000000000000000000000000000000000000150000000302001500000000000000000000000000000000000000000000000000000000000000000000000016000000030200160000000000000000000000000000000000000000000000000000000000000000000000001700000003020017000000000000000000000000000000000000000000000000000000000000000000000000180000000302001800000000000000000000000000000000000000000000000000000000000000000000000019000000030200190000000000000000000000000000000000000000000000000000000000000000000000001a0000000302001a0000000000000000000000000000000000000000000000000000000000000000000000001b0000000302001b0000000000000000000000000000000000000000000000000000000000000000000000001c0000000302001c0000000000000000000000000000000000000000000000000000000000000000000000001d0000000302001d0000000000000000000000000000000000000000000000000000000000000000000000001e0000000302001e0000000000000000000000000000000000000000000000000000000000000000000000001f0000000302001f00000000000000000000000000000000000000000000000000000000000000000000000020000000030200200000000000000000000000000000000000000000000000000000000000000000000000002100000003020021000000000000000000000000000000000000000000000000000000000000000000000000220000000302002200000000000000000000000000000000000000000000000000000000000000000000000023000000030200230000000000000000000000000000000000000000000000000000000000000000000000002400000003020024000000000000000000000000000000000000000000000000000000000000000000000000250000000302002500000000000000000000000000000000000000000000000000000000000000000000000026000000030200260000000000000000000000000000000000000000000000000000000000000000000000002700000003020027000000000000000000000000000000000000000000000000000000000000000000000000280000000302002800000000000000000000000000000000000000000000000000000000000000000000000029000000030200290000000000000000000000000000000000000000000000000000000000000000000000002a0000000302002a0000000000000000000000000000000000000000000000000000000000000000000000002b0000000302002b0000000000000000000000000000000000000000000000000000000000000000000000002c0000000302002c0000000000000000000000000000000000000000000000000000000000000000000000002d0000000302002d0000000000000000000000000000000000000000000000000000000000000000000000002e0000000302002e0000000000000000000000000000000000000000000000000000000000000000000000002f0000000302002f00000000000000000000000000000000000000000000000000000000000000000000000030000000030200300000000000000000000000000000000000000000000000000000000000000000000000003100000003020031000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001900c78851abc78852c78853c7ab8857c7885dc788ab012ac78710270000000000000402000187102700000000000004020002871027000000000000040200038710270000000000000402000487102700000000000004020005871027000000000000040200068710270000000000000402000787102700000000000004020008871027000000000000040200098710270000000000000402000a8710270000000000000402000b8710270000000000000402000c8710270000000000000402000d8710270000000000000402000e8710270000000000000402000f871027000000000000040200108710270000000000000402001187102700000000000004020012871027000000000000040200138710270000000000000402001487102700000000000004020015871027000000000000040200168710270000000000000402001787102700000000000004020018871027000000000000040200198710270000000000000402001a8710270000000000000402001b8710270000000000000402001c8710270000000000000402001d8710270000000000000402001e8710270000000000000402001f871027000000000000040200208710270000000000000402002187102700000000000004020022871027000000000000040200238710270000000000000402002487102700000000000004020025871027000000000000040200268710270000000000000402002787102700000000000004020028871027000000000000040200298710270000000000000402002a8710270000000000000402002b8710270000000000000402002c8710270000000000000402002d8710270000000000000402002e8710270000000000000402002f871027000000000000040200308710270000000000000402003187"], + ["4vuv4", "Transaction inspection: OP_OUTPOINTTXHASH (input 0) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<0> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c887", 1], + ["nnh8r", "Transaction inspection: OP_OUTPOINTTXHASH (input 1) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000000>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000021200000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c887", 1], + ["79z0d", "Transaction inspection: OP_OUTPOINTTXHASH (input 1, 0x00...01) (nonP2SH)", "<0x0000000000000000000000000000000000000000000000000000000000000001>", "<1> OP_OUTPOINTTXHASH OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000000100000000010000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c887102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["tzw9j", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c875", 1], + ["kd3jc", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTTXHASH OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c875", 1], + ["p8e6t", "Transaction inspection: OP_OUTPOINTTXHASH (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTTXHASH OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c875102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["3ss4h", "Transaction inspection: multiple OP_OUTPOINTTXHASHs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTTXHASH <0> OP_OUTPOINTTXHASH OP_EQUALVERIFY <1> OP_OUTPOINTTXHASH <1> OP_OUTPOINTTXHASH OP_EQUALVERIFY <3> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <13> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUALVERIFY <42> OP_OUTPOINTTXHASH <1> OP_SPLIT OP_DROP OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d5300000000000000000000000000000000000000000000000000000000000000000000000101000000025100000000000000000000000000000000000000000000000000000000000000000000000002020000000251000000000000000000000000000000000000000000000000000000000000000000000000030300000002510000000000000000000000000000000000000000000000000000000000000000000000000404000000025100000000000000000000000000000000000000000000000000000000000000000000000005050000000251000000000000000000000000000000000000000000000000000000000000000000000000060600000002510000000000000000000000000000000000000000000000000000000000000000000000000707000000025100000000000000000000000000000000000000000000000000000000000000000000000008080000000251000000000000000000000000000000000000000000000000000000000000000000000000090900000002510000000000000000000000000000000000000000000000000000000000000000000000000a0a00000002510000000000000000000000000000000000000000000000000000000000000000000000000b0b00000002510000000000000000000000000000000000000000000000000000000000000000000000000c0c00000002510000000000000000000000000000000000000000000000000000000000000000000000000d0d00000002510000000000000000000000000000000000000000000000000000000000000000000000000e0e00000002510000000000000000000000000000000000000000000000000000000000000000000000000f0f0000000251000000000000000000000000000000000000000000000000000000000000000000000000101000000002510000000000000000000000000000000000000000000000000000000000000000000000001111000000025100000000000000000000000000000000000000000000000000000000000000000000000012120000000251000000000000000000000000000000000000000000000000000000000000000000000000131300000002510000000000000000000000000000000000000000000000000000000000000000000000001414000000025100000000000000000000000000000000000000000000000000000000000000000000000015150000000251000000000000000000000000000000000000000000000000000000000000000000000000161600000002510000000000000000000000000000000000000000000000000000000000000000000000001717000000025100000000000000000000000000000000000000000000000000000000000000000000000018180000000251000000000000000000000000000000000000000000000000000000000000000000000000191900000002510000000000000000000000000000000000000000000000000000000000000000000000001a1a00000002510000000000000000000000000000000000000000000000000000000000000000000000001b1b00000002510000000000000000000000000000000000000000000000000000000000000000000000001c1c00000002510000000000000000000000000000000000000000000000000000000000000000000000001d1d00000002510000000000000000000000000000000000000000000000000000000000000000000000001e1e00000002510000000000000000000000000000000000000000000000000000000000000000000000001f1f0000000251000000000000000000000000000000000000000000000000000000000000000000000000202000000002510000000000000000000000000000000000000000000000000000000000000000000000002121000000025100000000000000000000000000000000000000000000000000000000000000000000000022220000000251000000000000000000000000000000000000000000000000000000000000000000000000232300000002510000000000000000000000000000000000000000000000000000000000000000000000002424000000025100000000000000000000000000000000000000000000000000000000000000000000000025250000000251000000000000000000000000000000000000000000000000000000000000000000000000262600000002510000000000000000000000000000000000000000000000000000000000000000000000002727000000025100000000000000000000000000000000000000000000000000000000000000000000000028280000000251000000000000000000000000000000000000000000000000000000000000000000000000292900000002510000000000000000000000000000000000000000000000000000000000000000000000002a2a00000002510000000000000000000000000000000000000000000000000000000000000000000000002b2b00000002510000000000000000000000000000000000000000000000000000000000000000000000002c2c00000002510000000000000000000000000000000000000000000000000000000000000000000000002d2d00000002510000000000000000000000000000000000000000000000000000000000000000000000002e2e00000002510000000000000000000000000000000000000000000000000000000000000000000000002f2f0000000251000000000000000000000000000000000000000000000000000000000000000000000000303000000002510000000000000000000000000000000000000000000000000000000000000000000000003131000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001d00c800c88851c851c88853c8517f75885dc8517f7588012ac8517f7587102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["c8x8a", "Transaction inspection: OP_OUTPOINTINDEX (input 0) (nonP2SH)", "<0>", "<0> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c987", 1], + ["43nsl", "Transaction inspection: OP_OUTPOINTINDEX (input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c987", 1], + ["arjyx", "Transaction inspection: OP_OUTPOINTINDEX (input 1, 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351c987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["ecauy", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300c975", 1], + ["9cgnu", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_OUTPOINTINDEX OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351c975", 1], + ["44xf8", "Transaction inspection: OP_OUTPOINTINDEX (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_OUTPOINTINDEX OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352c975102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["0ma3s", "Transaction inspection: multiple OP_OUTPOINTINDEXs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_OUTPOINTINDEX <0> OP_EQUALVERIFY <1> OP_OUTPOINTINDEX <1> OP_OUTPOINTINDEX OP_EQUALVERIFY <3> OP_OUTPOINTINDEX OP_EQUALVERIFY <13> OP_OUTPOINTINDEX OP_EQUALVERIFY <42> OP_OUTPOINTINDEX OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000000000000000000000000000000000000000000000000000000000000000000030000000251000000000000000000000000000000000000000000000000000000000000000000000000000400000002510000000000000000000000000000000000000000000000000000000000000000000000000005000000025100000000000000000000000000000000000000000000000000000000000000000000000000060000000251000000000000000000000000000000000000000000000000000000000000000000000000000700000002510000000000000000000000000000000000000000000000000000000000000000000000000008000000025100000000000000000000000000000000000000000000000000000000000000000000000000090000000251000000000000000000000000000000000000000000000000000000000000000000000000000a0000000251000000000000000000000000000000000000000000000000000000000000000000000000000b0000000251000000000000000000000000000000000000000000000000000000000000000000000000000c0000000251000000000000000000000000000000000000000000000000000000000000000000000000000d0000000251000000000000000000000000000000000000000000000000000000000000000000000000000e0000000251000000000000000000000000000000000000000000000000000000000000000000000000000f000000025100000000000000000000000000000000000000000000000000000000000000000000000000100000000251000000000000000000000000000000000000000000000000000000000000000000000000001100000002510000000000000000000000000000000000000000000000000000000000000000000000000012000000025100000000000000000000000000000000000000000000000000000000000000000000000000130000000251000000000000000000000000000000000000000000000000000000000000000000000000001400000002510000000000000000000000000000000000000000000000000000000000000000000000000015000000025100000000000000000000000000000000000000000000000000000000000000000000000000160000000251000000000000000000000000000000000000000000000000000000000000000000000000001700000002510000000000000000000000000000000000000000000000000000000000000000000000000018000000025100000000000000000000000000000000000000000000000000000000000000000000000000190000000251000000000000000000000000000000000000000000000000000000000000000000000000001a0000000251000000000000000000000000000000000000000000000000000000000000000000000000001b0000000251000000000000000000000000000000000000000000000000000000000000000000000000001c0000000251000000000000000000000000000000000000000000000000000000000000000000000000001d0000000251000000000000000000000000000000000000000000000000000000000000000000000000001e0000000251000000000000000000000000000000000000000000000000000000000000000000000000001f000000025100000000000000000000000000000000000000000000000000000000000000000000000000200000000251000000000000000000000000000000000000000000000000000000000000000000000000002100000002510000000000000000000000000000000000000000000000000000000000000000000000000022000000025100000000000000000000000000000000000000000000000000000000000000000000000000230000000251000000000000000000000000000000000000000000000000000000000000000000000000002400000002510000000000000000000000000000000000000000000000000000000000000000000000000025000000025100000000000000000000000000000000000000000000000000000000000000000000000000260000000251000000000000000000000000000000000000000000000000000000000000000000000000002700000002510000000000000000000000000000000000000000000000000000000000000000000000000028000000025100000000000000000000000000000000000000000000000000000000000000000000000000290000000251000000000000000000000000000000000000000000000000000000000000000000000000002a0000000251000000000000000000000000000000000000000000000000000000000000000000000000002b0000000251000000000000000000000000000000000000000000000000000000000000000000000000002c0000000251000000000000000000000000000000000000000000000000000000000000000000000000002d0000000251000000000000000000000000000000000000000000000000000000000000000000000000002e0000000251000000000000000000000000000000000000000000000000000000000000000000000000002f0000000251000000000000000000000000000000000000000000000000000000000000000000000000003000000002510000000000000000000000000000000000000000000000000000000000000000000000000031000000025100000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300c9008851c951c98853c9885dc988012ac987102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["p3v45", "Transaction inspection: OP_INPUTBYTECODE (input 0) (nonP2SH)", "<0>", "OP_INPUTBYTECODE <<0x016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc3> <0x03a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000068ca4c6441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78587", 1], + ["sdgfd", "Transaction inspection: OP_INPUTBYTECODE (self, nonP2SH) (nonP2SH)", "<1>", "OP_INPUTBYTECODE <<1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000004ca015187", 1], + ["prtnj", "Transaction inspection: OP_INPUTBYTECODE, OP_CODESEPARATOR in input bytecode has no effect (self, nonP2SH) (nonP2SH)", "<1> OP_CODESEPARATOR <1>", "OP_VERIFY OP_INPUTBYTECODE <<1> OP_CODESEPARATOR <1>> OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000351ab51000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000769ca0351ab5187", 1], + ["x7n7u", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300ca75", 1], + ["9gg2c", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351ca75", 1], + ["dlnwf", "Transaction inspection: OP_INPUTBYTECODE (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTBYTECODE OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352ca75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["x4vrl", "Transaction inspection: multiple OP_INPUTBYTECODEs (50 inputs) (nonP2SH)", "<<0x00 42> <<0x00 42> OP_EQUAL>> <<0x00 13> <<0x00 13> OP_EQUAL>> <<0x00 7> <<0x00 7> OP_EQUAL>> <<0x00 1> <<0x00 1> OP_EQUAL>>", "<0> OP_INPUTBYTECODE <0> OP_INPUTBYTECODE OP_EQUALVERIFY <1> OP_INPUTBYTECODE OP_EQUALVERIFY <7> OP_INPUTBYTECODE OP_EQUALVERIFY <13> OP_INPUTBYTECODE OP_EQUALVERIFY <42> OP_INPUTBYTECODE OP_EQUAL", "0200000032000000000000000000000000000000000000000000000000000000000000000000000000240802002a0402002a870802000d0402000d870802000704020007870802000104020001870000000000000000000000000000000000000000000000000000000000000000000000000100000008020001040200018700000000000000000000000000000000000000000000000000000000000000000000000002000000080200020402000287000000000000000000000000000000000000000000000000000000000000000000000000030000000802000304020003870000000000000000000000000000000000000000000000000000000000000000000000000400000008020004040200048700000000000000000000000000000000000000000000000000000000000000000000000005000000080200050402000587000000000000000000000000000000000000000000000000000000000000000000000000060000000802000604020006870000000000000000000000000000000000000000000000000000000000000000000000000700000008020007040200078700000000000000000000000000000000000000000000000000000000000000000000000008000000080200080402000887000000000000000000000000000000000000000000000000000000000000000000000000090000000802000904020009870000000000000000000000000000000000000000000000000000000000000000000000000a0000000802000a0402000a870000000000000000000000000000000000000000000000000000000000000000000000000b0000000802000b0402000b870000000000000000000000000000000000000000000000000000000000000000000000000c0000000802000c0402000c870000000000000000000000000000000000000000000000000000000000000000000000000d0000000802000d0402000d870000000000000000000000000000000000000000000000000000000000000000000000000e0000000802000e0402000e870000000000000000000000000000000000000000000000000000000000000000000000000f0000000802000f0402000f87000000000000000000000000000000000000000000000000000000000000000000000000100000000802001004020010870000000000000000000000000000000000000000000000000000000000000000000000001100000008020011040200118700000000000000000000000000000000000000000000000000000000000000000000000012000000080200120402001287000000000000000000000000000000000000000000000000000000000000000000000000130000000802001304020013870000000000000000000000000000000000000000000000000000000000000000000000001400000008020014040200148700000000000000000000000000000000000000000000000000000000000000000000000015000000080200150402001587000000000000000000000000000000000000000000000000000000000000000000000000160000000802001604020016870000000000000000000000000000000000000000000000000000000000000000000000001700000008020017040200178700000000000000000000000000000000000000000000000000000000000000000000000018000000080200180402001887000000000000000000000000000000000000000000000000000000000000000000000000190000000802001904020019870000000000000000000000000000000000000000000000000000000000000000000000001a0000000802001a0402001a870000000000000000000000000000000000000000000000000000000000000000000000001b0000000802001b0402001b870000000000000000000000000000000000000000000000000000000000000000000000001c0000000802001c0402001c870000000000000000000000000000000000000000000000000000000000000000000000001d0000000802001d0402001d870000000000000000000000000000000000000000000000000000000000000000000000001e0000000802001e0402001e870000000000000000000000000000000000000000000000000000000000000000000000001f0000000802001f0402001f87000000000000000000000000000000000000000000000000000000000000000000000000200000000802002004020020870000000000000000000000000000000000000000000000000000000000000000000000002100000008020021040200218700000000000000000000000000000000000000000000000000000000000000000000000022000000080200220402002287000000000000000000000000000000000000000000000000000000000000000000000000230000000802002304020023870000000000000000000000000000000000000000000000000000000000000000000000002400000008020024040200248700000000000000000000000000000000000000000000000000000000000000000000000025000000080200250402002587000000000000000000000000000000000000000000000000000000000000000000000000260000000802002604020026870000000000000000000000000000000000000000000000000000000000000000000000002700000008020027040200278700000000000000000000000000000000000000000000000000000000000000000000000028000000080200280402002887000000000000000000000000000000000000000000000000000000000000000000000000290000000802002904020029870000000000000000000000000000000000000000000000000000000000000000000000002a0000000802002a0402002a870000000000000000000000000000000000000000000000000000000000000000000000002b0000000802002b0402002b870000000000000000000000000000000000000000000000000000000000000000000000002c0000000802002c0402002c870000000000000000000000000000000000000000000000000000000000000000000000002d0000000802002d0402002d870000000000000000000000000000000000000000000000000000000000000000000000002e0000000802002e0402002e870000000000000000000000000000000000000000000000000000000000000000000000002f0000000802002f0402002f870000000000000000000000000000000000000000000000000000000000000000000000003000000008020030040200308700000000000000000000000000000000000000000000000000000000000000000000000031000000080200310402003187000000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001200ca00ca8851ca8857ca885dca88012aca87102700000000000017a9142c2f8a9faabf933ea074a4dbfd97903fe1f9f4bb87102700000000000017a914c2e604786e623e7b0cec3d37375c43ff2129969687102700000000000017a914ea1e770b7b0ae2bd4b79c5fc8af9123aeba7bcca87102700000000000017a91401ddbba51662c0d1a3d03b597832f5a63804239b87102700000000000017a9149a725758db722f118241f03c1850c67735ddf2c987102700000000000017a914199435a1a7f6f3c705f551459d1fcb549f153f0387102700000000000017a91470fdd6ac6de402301eb42ebdf606356fb15a90be87102700000000000017a9149543818b5aff47c5a920f493e63e62ab066e391a87102700000000000017a914e050ed3f2f2733dd1f7b5faae2906e9ebfca17b587102700000000000017a91444de302e625b8971e14d163a4dbe9c011e7b640287102700000000000017a9144337e459e667ee44d3f50c5070bc9e681a577b3a87102700000000000017a914cf486d206fc1c9c0d428663aa4625cb8f4e3d09487102700000000000017a914c6f995b29396a65175c6d56431e08b10e0c542ed87102700000000000017a914d491886beeea73a257faffaa3b76d1157d87c3be87102700000000000017a914bd44dcc9d2ebcb8999696fe8cb4171e89e13cd9d87102700000000000017a914c2c4fd55539cad33cb620180140d188d0d22db2587102700000000000017a91485b3f92d1ea8bb0ca30887af2c00eed0894d4bb387102700000000000017a91462f769c09c2249cf2cb10616583e5546ff5ba25887102700000000000017a9143818fba6baf05bd0f98543dfacfc071751c522c887102700000000000017a91420be4b7c68f0eb9fc3a785518350d552bdd4d85287102700000000000017a91486023de12723e08b3e72d18aef04df5a1c7937cd87102700000000000017a91430fafe4ca2ee885afeabdad7822c9e8fbc2397ef87102700000000000017a914516d16a4435122dec8ee514c971ba1fa2823eff987102700000000000017a9147f5901dce2d08d95b7798ab69255054c2328856487102700000000000017a914bb3915a5176893b12ab3af1d7c1382b0a0d4607487102700000000000017a91436afcfd945ba8ceb1b6a243525ae037c4295350087102700000000000017a914c7a9e244b92bf7fcaf32d9815ed9c1095ffd7f9587102700000000000017a914b36ec9ffa0b7f117efd3ce5678050074f35c909d87102700000000000017a914354292cadcb6e772bd2fa76b421fd4e32792cbbf87102700000000000017a914850ac9087274fa67ed7d0027ddab7503c2fbd64b87102700000000000017a914f01ffb2ffa754b22c38b1508041017ef732e597787102700000000000017a9144b586ec0a0fcb08df1baebf8538f857174fa78b387102700000000000017a914bfc572c39c8d12bf4491526998ad9b8bd92dc7bf87102700000000000017a9141ba5af082a0c097b504cc4af9e5dd0dd6afaa70187102700000000000017a9142fac4ba9bda62df5cb1a07c672c0084dcede82c287102700000000000017a914512cff995df900380d0dadf82550dd0480caf20387102700000000000017a9145ac77b248e98ee3a0927cff507f5dadcbca52d1287102700000000000017a91489ad59a39d2a6d765085aa3175eb08d6bf6ea41687102700000000000017a914ccdca1ca32ae365fc9bcf7c1a09e2cb3930f4da287102700000000000017a914672e897736fd522a2caba9bae7fde3fd03e3a58487102700000000000017a914a0b212dd3f1cec05ec28a7b907867a73f33963b787102700000000000017a914a55a84e81d985752b8aeda11ff370c0437f315f087102700000000000017a914608fea2e67458858a972f8e490a0416e6450c52287102700000000000017a914861ecd37b1894d00b918d56f83eeac31d163dcca87102700000000000017a9140f442d2dc1080e0a4f287f72ea030de8c14e728c87102700000000000017a9145d670db0cd8cfa086d557fdbfe2fde7b1526bf2887102700000000000017a9141e8261563d102330f087d8060cc37af1db2be04e87102700000000000017a91486fe25509b16f6d5cd5951e644d23091f26d901887102700000000000017a914c9d96190a55b8776510dce3477a6d3f958177bf987"], + ["j2z86", "Transaction inspection: OP_INPUTBYTECODE (maximum size) (nonP2SH)", "<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>", "<<0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304>> <1> OP_INPUTBYTECODE OP_EQUAL OP_NIP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020304000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000fd0f024d08024d0502000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030451ca8777", 1], + ["dtx7r", "Transaction inspection: OP_INPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1> <0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe>", "OP_DROP <1> OP_INPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0302514dff01000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac1027000000000000047551ca75", 1], + ["ne0zn", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0) (nonP2SH)", "<0>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb87", 1], + ["l46dz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1) (nonP2SH)", "<0>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb87", 1], + ["mnn9j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1, 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000000000000000001000000025100010000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["32g8j", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff00ffffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0200000000000000000300cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["flpv2", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 0 sequence number: 4294967294; locktime not disabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <0> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff00feffffff000000000000000000000000000000000000000000000000000000000000000001000000025100000000000100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17500cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["8pgnz", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; disables locktime support) (nonP2SH)", "<4294967295>", "<1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737400000000", "0200000000000000000351cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["ljmun", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967294; locktime enabled) (nonP2SH)", "<4294967294>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605feffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100feffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["x6sc5", "Transaction inspection: OP_INPUTSEQUENCENUMBER (input 1 sequence number: 4294967295; locktime is disabled for input 1, but remains enabled for input 0) (nonP2SH)", "<4294967295>", "<1> OP_CHECKLOCKTIMEVERIFY OP_DROP <1> OP_INPUTSEQUENCENUMBER OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000000605ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000001000000025100ffffffff0100000000000000000a6a08766d625f7465737401000000", "0200000000000000000651b17551cb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["xuj8t", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 0) (nonP2SH)", "<1>", "<0> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cb75", 1], + ["ej6ln", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 1) (nonP2SH)", "<1>", "<1> OP_INPUTSEQUENCENUMBER OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000351cb75", 1], + ["lfxk6", "Transaction inspection: OP_INPUTSEQUENCENUMBER (ignore result, input 2) (nonP2SH)", "<1>", "<2> OP_INPUTSEQUENCENUMBER OP_DROP", "020000000300000000000000000000000000000000000000000000000000000000000000000000000001510000000000000000000000000000000000000000000000000000000000000000000000000100000002510000000000000000000000000000000000000000000000000000000000000000000000000002000000025100000000000100000000000000000a6a08766d625f7465737400000000", "0300000000000000000352cb75102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["su5t7", "Transaction inspection: multiple OP_INPUTSEQUENCENUMBERs (50 inputs) (nonP2SH)", "<42> <13> <3>", "<0> OP_INPUTSEQUENCENUMBER <0> OP_EQUALVERIFY <1> OP_INPUTSEQUENCENUMBER <1> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <3> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <13> OP_INPUTSEQUENCENUMBER OP_EQUALVERIFY <42> OP_INPUTSEQUENCENUMBER OP_EQUAL", "020000003200000000000000000000000000000000000000000000000000000000000000000000000004012a5d530000000000000000000000000000000000000000000000000000000000000000000000000100000002510001000000000000000000000000000000000000000000000000000000000000000000000002000000025100020000000000000000000000000000000000000000000000000000000000000000000000030000000251000300000000000000000000000000000000000000000000000000000000000000000000000400000002510004000000000000000000000000000000000000000000000000000000000000000000000005000000025100050000000000000000000000000000000000000000000000000000000000000000000000060000000251000600000000000000000000000000000000000000000000000000000000000000000000000700000002510007000000000000000000000000000000000000000000000000000000000000000000000008000000025100080000000000000000000000000000000000000000000000000000000000000000000000090000000251000900000000000000000000000000000000000000000000000000000000000000000000000a0000000251000a00000000000000000000000000000000000000000000000000000000000000000000000b0000000251000b00000000000000000000000000000000000000000000000000000000000000000000000c0000000251000c00000000000000000000000000000000000000000000000000000000000000000000000d0000000251000d00000000000000000000000000000000000000000000000000000000000000000000000e0000000251000e00000000000000000000000000000000000000000000000000000000000000000000000f0000000251000f0000000000000000000000000000000000000000000000000000000000000000000000100000000251001000000000000000000000000000000000000000000000000000000000000000000000001100000002510011000000000000000000000000000000000000000000000000000000000000000000000012000000025100120000000000000000000000000000000000000000000000000000000000000000000000130000000251001300000000000000000000000000000000000000000000000000000000000000000000001400000002510014000000000000000000000000000000000000000000000000000000000000000000000015000000025100150000000000000000000000000000000000000000000000000000000000000000000000160000000251001600000000000000000000000000000000000000000000000000000000000000000000001700000002510017000000000000000000000000000000000000000000000000000000000000000000000018000000025100180000000000000000000000000000000000000000000000000000000000000000000000190000000251001900000000000000000000000000000000000000000000000000000000000000000000001a0000000251001a00000000000000000000000000000000000000000000000000000000000000000000001b0000000251001b00000000000000000000000000000000000000000000000000000000000000000000001c0000000251001c00000000000000000000000000000000000000000000000000000000000000000000001d0000000251001d00000000000000000000000000000000000000000000000000000000000000000000001e0000000251001e00000000000000000000000000000000000000000000000000000000000000000000001f0000000251001f0000000000000000000000000000000000000000000000000000000000000000000000200000000251002000000000000000000000000000000000000000000000000000000000000000000000002100000002510021000000000000000000000000000000000000000000000000000000000000000000000022000000025100220000000000000000000000000000000000000000000000000000000000000000000000230000000251002300000000000000000000000000000000000000000000000000000000000000000000002400000002510024000000000000000000000000000000000000000000000000000000000000000000000025000000025100250000000000000000000000000000000000000000000000000000000000000000000000260000000251002600000000000000000000000000000000000000000000000000000000000000000000002700000002510027000000000000000000000000000000000000000000000000000000000000000000000028000000025100280000000000000000000000000000000000000000000000000000000000000000000000290000000251002900000000000000000000000000000000000000000000000000000000000000000000002a0000000251002a00000000000000000000000000000000000000000000000000000000000000000000002b0000000251002b00000000000000000000000000000000000000000000000000000000000000000000002c0000000251002c00000000000000000000000000000000000000000000000000000000000000000000002d0000000251002d00000000000000000000000000000000000000000000000000000000000000000000002e0000000251002e00000000000000000000000000000000000000000000000000000000000000000000002f0000000251002f00000000000000000000000000000000000000000000000000000000000000000000003000000002510030000000000000000000000000000000000000000000000000000000000000000000000031000000025100310000000100000000000000000a6a08766d625f7465737400000000", "3200000000000000001300cb008851cb51cb8853cb885dcb88012acb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87102700000000000017a914b472a266d0bd89c13706a4132ccfb16f7c3b9fcb87"], + ["9dfdk", "Transaction inspection: OP_OUTPUTVALUE (output 0) (nonP2SH)", "<0>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000100000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["n2dmk", "Transaction inspection: OP_OUTPUTVALUE (output 0, 10_000) (nonP2SH)", "<10_000>", "<0> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d61a9c8e40887e2bd241707d1ddb6e2730e4e87aeca1e9a5175b4a2042ed36c73beb5c9bee7c2b95e8856a3b31dd3e5ab55c0262eadd942a996859a5fd426076c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000003021027000000000110270000000000000300cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc87", 1], + ["0a403", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cc75", 1], + ["35z4f", "Transaction inspection: OP_OUTPUTVALUE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTVALUE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441e74e37c3e51e571a06696d6082441280de4d2eb0b2c7c472fdb2c751566dc528308127a8c5613cba1293e8811c3d24c90518bbf680d263a056e4183c07f9db96c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cc7511270000000000000352cc7512270000000000000352cc7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cc75", 1], + ["v7rla", "Transaction inspection: multiple OP_OUTPUTVALUEs (50 inputs) (nonP2SH)", "<10_042> <10_013> <10_007> <10_001>", "<0> OP_OUTPUTVALUE <0> OP_OUTPUTVALUE OP_EQUALVERIFY <1> OP_OUTPUTVALUE OP_EQUALVERIFY <7> OP_OUTPUTVALUE OP_EQUALVERIFY <13> OP_OUTPUTVALUE OP_EQUALVERIFY <42> OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441337957e0102253ea781600e6016bdc119f57a88e9da12413354d6b2c105fadc65a7a5708515991b2cc66a020df73f6f27f8b3789e4ad5494d18ac32e552267acc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000c023a27021d27021727021127000000003210270000000000001200cc00cc8851cc8857cc885dcc88012acc8711270000000000001200cc00cc8851cc8857cc885dcc88012acc8712270000000000001200cc00cc8851cc8857cc885dcc88012acc8713270000000000001200cc00cc8851cc8857cc885dcc88012acc8714270000000000001200cc00cc8851cc8857cc885dcc88012acc8715270000000000001200cc00cc8851cc8857cc885dcc88012acc8716270000000000001200cc00cc8851cc8857cc885dcc88012acc8717270000000000001200cc00cc8851cc8857cc885dcc88012acc8718270000000000001200cc00cc8851cc8857cc885dcc88012acc8719270000000000001200cc00cc8851cc8857cc885dcc88012acc871a270000000000001200cc00cc8851cc8857cc885dcc88012acc871b270000000000001200cc00cc8851cc8857cc885dcc88012acc871c270000000000001200cc00cc8851cc8857cc885dcc88012acc871d270000000000001200cc00cc8851cc8857cc885dcc88012acc871e270000000000001200cc00cc8851cc8857cc885dcc88012acc871f270000000000001200cc00cc8851cc8857cc885dcc88012acc8720270000000000001200cc00cc8851cc8857cc885dcc88012acc8721270000000000001200cc00cc8851cc8857cc885dcc88012acc8722270000000000001200cc00cc8851cc8857cc885dcc88012acc8723270000000000001200cc00cc8851cc8857cc885dcc88012acc8724270000000000001200cc00cc8851cc8857cc885dcc88012acc8725270000000000001200cc00cc8851cc8857cc885dcc88012acc8726270000000000001200cc00cc8851cc8857cc885dcc88012acc8727270000000000001200cc00cc8851cc8857cc885dcc88012acc8728270000000000001200cc00cc8851cc8857cc885dcc88012acc8729270000000000001200cc00cc8851cc8857cc885dcc88012acc872a270000000000001200cc00cc8851cc8857cc885dcc88012acc872b270000000000001200cc00cc8851cc8857cc885dcc88012acc872c270000000000001200cc00cc8851cc8857cc885dcc88012acc872d270000000000001200cc00cc8851cc8857cc885dcc88012acc872e270000000000001200cc00cc8851cc8857cc885dcc88012acc872f270000000000001200cc00cc8851cc8857cc885dcc88012acc8730270000000000001200cc00cc8851cc8857cc885dcc88012acc8731270000000000001200cc00cc8851cc8857cc885dcc88012acc8732270000000000001200cc00cc8851cc8857cc885dcc88012acc8733270000000000001200cc00cc8851cc8857cc885dcc88012acc8734270000000000001200cc00cc8851cc8857cc885dcc88012acc8735270000000000001200cc00cc8851cc8857cc885dcc88012acc8736270000000000001200cc00cc8851cc8857cc885dcc88012acc8737270000000000001200cc00cc8851cc8857cc885dcc88012acc8738270000000000001200cc00cc8851cc8857cc885dcc88012acc8739270000000000001200cc00cc8851cc8857cc885dcc88012acc873a270000000000001200cc00cc8851cc8857cc885dcc88012acc873b270000000000001200cc00cc8851cc8857cc885dcc88012acc873c270000000000001200cc00cc8851cc8857cc885dcc88012acc873d270000000000001200cc00cc8851cc8857cc885dcc88012acc873e270000000000001200cc00cc8851cc8857cc885dcc88012acc873f270000000000001200cc00cc8851cc8857cc885dcc88012acc8740270000000000001200cc00cc8851cc8857cc885dcc88012acc8741270000000000001200cc00cc8851cc8857cc885dcc88012acc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cc00cc8851cc8857cc885dcc88012acc87", 1], + ["d3e4s", "Transaction inspection: OP_OUTPUTVALUE (1.23456789 BCH) (nonP2SH)", "<123_456_789> <0>", "OP_OUTPUTVALUE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064411914d1d16f673884038b449f7090a0d3c657148c3fd3cc190d2290a4d65884d9432c0a3dd67c6d57fabe62ec832e90697971e0f38ba8d1c88ca00908c21d3f2dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000060415cd5b0700000000000115cd5b070000000002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["6r2qt", "Transaction inspection: OP_OUTPUTVALUE (21,000,000 BCH) (nonP2SH)", "<2_100_000_000_000_000> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441d098cb4d916b27db8b87cd5f3c3d2217db455c3da3b43b81e45fde35783c44e4a2d100175c6a77d21e3ac5e5ccc1b5aff22ae3d5b0474b464b84c1bebe972b57c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000009070040075af075070000000000010040075af075070002cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["8jy9k", "Transaction inspection: OP_OUTPUTVALUE (maximum VM Number satoshis) (nonP2SH)", "<9223372036854775807> <0>", "OP_OUTPUTVALUE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441da662ce444d3cd6a30cb9dd4692ba617e5d81dfb784076e4ae07662bfe71db735a2a3224a0b2f83130c289e2361eeb325e94236b605b27bf75b9aded47559e8bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000a08ffffffffffffff7f000000000001ffffffffffffff7f02cc8700000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000002cc87", 1], + ["efhhm", "Transaction inspection: OP_OUTPUTBYTECODE (output 0) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000b0a6a08766d625f74657374000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["dkajw", "Transaction inspection: OP_OUTPUTBYTECODE (output 0, ) (nonP2SH)", "", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417c68be9ab2f95d1572baf4d558c9ecf3deb27abfe3b9cae9847c07e34b329fa83a9f3a60e389bac89552f5b7bb5693b6e33991e8cc1b0bbf6d64f345c2511ffac32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000002016a00000000011027000000000000016a00000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["5flt6", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (nonP2SH)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000040375ab51000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000400abcd87", 1], + ["5msmp", "Transaction inspection: OP_OUTPUTBYTECODE, OP_CODESEPARATOR has no effect (output 0, ) (P2SH20)", ">", "<0> OP_CODESEPARATOR OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441a09d30e8495b19d73a40b7d27244704f7e53bd4879af0a961448dac1a5cc0ac2243120e299a3e66f6a38986c5a11734bb004dc4be87cc87676d2a53e98e87248c32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000090375ab510400abcd87000000000110270000000000000375ab5100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914ddb90ed315acb3ebe30542f597c8fe1d9dec8c2287", 1], + ["vqx55", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 0) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441016bef010b024a4ac48b0d37b6d68866fd5d878cf85e6778e913a43cece4e0c4a176f874b8d092619d67857d189f4b9542576b010687310490c538985edbb94cc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000100000000000000000a6a08766d625f7465737400000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["pw0vv", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, output 2) (nonP2SH)", "<1>", "<2> OP_OUTPUTBYTECODE OP_DROP", "020000000200000000000000000000000000000000000000000000000000000000000000000000000064417f2007c39296c2ed52ddb689d72b289a6c9fdb8a1fc1ce2ad4b90c9ba31bdb058135753fb3245af5865531ad04b1bf0327e245c59b056da761e552ed4952cd2bc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000151000000000310270000000000000352cd7511270000000000000352cd7512270000000000000352cd7500000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000352cd75", 1], + ["9dcw7", "Transaction inspection: multiple OP_OUTPUTBYTECODEs (50 inputs) (nonP2SH)", "> > > >", "<0> OP_OUTPUTBYTECODE <0> OP_OUTPUTBYTECODE OP_EQUALVERIFY <1> OP_OUTPUTBYTECODE OP_EQUALVERIFY <7> OP_OUTPUTBYTECODE OP_EQUALVERIFY <13> OP_OUTPUTBYTECODE OP_EQUALVERIFY <42> OP_OUTPUTBYTECODE OP_EQUAL", "02000000020000000000000000000000000000000000000000000000000000000000000000000000006441bfcd266f85f871eca8aeb092e6e41e89533321973bb07e316294e596977239873c4cfb98c84f8e0aaa5b7497800cdaa3fd6d475f46f1cc8c6981fcb9c765999dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e785000000000000000000000000000000000000000000000000000000000000000000000000010000000d036a012a026a5d026a57026a5100000000321027000000000000026a001127000000000000026a511227000000000000026a521327000000000000026a531427000000000000026a541527000000000000026a551627000000000000026a561727000000000000026a571827000000000000026a581927000000000000026a591a27000000000000026a5a1b27000000000000026a5b1c27000000000000026a5c1d27000000000000026a5d1e27000000000000026a5e1f27000000000000026a5f2027000000000000026a602127000000000000036a01112227000000000000036a01122327000000000000036a01132427000000000000036a01142527000000000000036a01152627000000000000036a01162727000000000000036a01172827000000000000036a01182927000000000000036a01192a27000000000000036a011a2b27000000000000036a011b2c27000000000000036a011c2d27000000000000036a011d2e27000000000000036a011e2f27000000000000036a011f3027000000000000036a01203127000000000000036a01213227000000000000036a01223327000000000000036a01233427000000000000036a01243527000000000000036a01253627000000000000036a01263727000000000000036a01273827000000000000036a01283927000000000000036a01293a27000000000000036a012a3b27000000000000036a012b3c27000000000000036a012c3d27000000000000036a012d3e27000000000000036a012e3f27000000000000036a012f4027000000000000036a01304127000000000000036a013100000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000001200cd00cd8851cd8857cd885dcd88012acd87", 1], + ["h4ml9", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (nonP2SH)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0b024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd87", 1], + ["yvnt8", "Transaction inspection: OP_OUTPUTBYTECODE (maximum size) (P2SH20)", ">", "<0> OP_OUTPUTBYTECODE OP_EQUAL", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000fd0f024d08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030300cd8700000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d700a249426186fed1ced5ea41fa7280994723c887", 1], + ["y8zh2", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (nonP2SH)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e78500000000000000000000000000000000000000000000000000000000000000000000000001000000015100000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac10270000000000000300cd75", 1], + ["j4axz", "Transaction inspection: OP_OUTPUTBYTECODE (ignore result, not excessive size) (P2SH20)", "<1>", "<0> OP_OUTPUTBYTECODE OP_DROP", "0200000002000000000000000000000000000000000000000000000000000000000000000000000000644150f86f3357240ed985bfbc3c65f8213e88a7a7a3bba306280e4140d53e02bd214eb5ddbd0f99c1b724fed377b029fdbb6db55125eabd93b0b3c857dda1a2750dc32103a524f43d6166ad3567f18b0a5c769c6ab4dc02149f4d5095ccf4e8ffa293e7850000000000000000000000000000000000000000000000000000000000000000000000000100000005510300cd7500000000010000000000000000fd08026a4d0402000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff0001020300000000", "0210270000000000001976a91460011c6bf3f1dd98cff576437b9d85de780f497488ac102700000000000017a914d94169d849ab826bce52c0ba58648fdcb44d8deb87", 1] +] diff --git a/src/lib/vmb-tests/readme.md b/src/lib/vmb-tests/readme.md new file mode 100644 index 00000000..3154500b --- /dev/null +++ b/src/lib/vmb-tests/readme.md @@ -0,0 +1,56 @@ +# Libauth VMB Tests + +Libauth's test suite includes a set of cross-implementation Virtual Machine Bytecode (VMB) test vectors for each supported VM. All VMB test files can be found in the [`vmb-tests/generated` directory](./generated/). + +Libauth aims to provide support for the Virtual Machine (VM) used by every public bitcoin-like network and for public upgrade proposals with stable technical specifications. See [Libauth Instruction Sets](../instruction-sets/readme.md) for details. + +### Comparison to `script_tests.json` + +Like the C++ implementation's [`script_tests.json`](./../instruction-sets/bch/2021/fixtures/bchn/script_tests.json), VMB tests are encoded in a standard JSON format. While `script_tests` generally focused on testing only the "script" (VM bytecode) system, `vmb_tests` are designed to test the entire transaction validation infrastructure of a VM implementation: each test is encoded in a complete test transaction, and the test vector includes the UTXOs for which the test transaction must be verified. + +### VMB Test Contents + +Each VMB test is an array including: + +- A short, unique identifier for the test (based on the hash of the test contents) +- A string describing the purpose/behavior of the test +- The unlocking script under test (disassembled, i.e. human-readable) +- The locking script under test (disassembled) +- The full, encoded test transaction +- An encoded list of unspent transaction outputs (UTXOs) with which to verify the test transaction (ordered to match the input order of the test transaction) + +Every test vector in each VM's master test file (e.g. [`bch_vmb_tests.json`](./generated/bch/bch_vmb_tests.json)) also includes a list of labels indicating the VM configurations for which the test vector applies. This master test file is automatically broken up into a variety of smaller, single-configuration test files for easier use (e.g. [`bch_vmb_tests_2022_standard.json`](./generated/bch/bch_vmb_tests_2022_standard.json)). + +## Testing with `vmb_tests` + +VMB tests are designed to be very portable between VM implementations, encouraging better compatibility and cooperation in testing efforts across projects. + +### Standard Vs. Non-Standard VMs + +All of Libauth's supported VMs currently support both a `standard` and `non-standard` mode. + +The **`standard` mode** should be used by practically all applications. It is the strictest mode of operation, and it is used to validate transactions before accepting or relaying them over the P2P network. + +The **`non-standard` mode** is slightly more lax, and is only used to validate newly mined blocks. Because they cannot typically be relayed, non-standard transactions must be manually included by a miner. (By definition, any transaction that is valid in standard mode is also valid in non-standard mode.) + +This distinction between standard and non-standard modes offers the network [defense in depth]() against various kinds of attacks. + +For example, on some networks, it's possible to prepare thousands of UTXOs with non-standard locking scripts that can be unlocked using very small (non-P2SH) transactions but require unusually excessive resources to validate (e.g. the maximum number of `OP_HASH256` operations). If these non-standard redeem transactions were relayed and automatically accepted by a miner, the miner could inadvertently create an unusually slow-to-validate block. If another block is found before most miners are able to validate the slow-to-validate block, the first miner's hashing power would be wasted (and they would lose mining revenue). + +By maintaining this standard/non-standard distinction, the BCH ecosystem retains the flexibility to experiment with unusual, non-standard transactions while ensuring such activity is unlikely to negatively impact honest miners or the wider network. + +### Single-Implementation VMB Test Files + +For ease of use, VMB tests are divided into files by expected testing "mode", e.g. [`bch_vmb_tests_2022_standard.json`](./generated/bch/bch_vmb_tests_2022_standard.json). This is the recommended way to use VMB tests (rather than the VM's "master" test file, e.g. [`bch_vmb_tests.json`](./generated/bch/bch_vmb_tests.json), that requires more parsing). + +Three files are available for each VM corresponding with the modes in which the contained tests should be run: + +- **`standard`** – these tests must pass in both standard and non-standard mode. +- **`valid`** – these tests must pass in non-standard mode but fail in standard mode. +- **`invalid`** – these tests must fail in both standard and non-standard mode. + +For an example of VMB test usage, see [`bch-vmb-tests.spec.ts`](./bch-vmb-tests.spec.ts). + +### Generating VMB Tests + +Libauth's VMB tests are generated by the `yarn gen:vmb-tests` package script and committed to the repo. (Libauth's continuous integration tests also ensure that VMB tests remain up to date and passing on Libauth's VM implementations.) diff --git a/src/lib/vmb-tests/vmb-tests.ts b/src/lib/vmb-tests/vmb-tests.ts new file mode 100644 index 00000000..48ed7bfd --- /dev/null +++ b/src/lib/vmb-tests/vmb-tests.ts @@ -0,0 +1 @@ +export * from './bch-vmb-test-utils.js'; diff --git a/src/types/rollup-plugin-alias.d.ts b/src/types/rollup-plugin-alias.d.ts index 0dc1b049..cac423b1 100644 --- a/src/types/rollup-plugin-alias.d.ts +++ b/src/types/rollup-plugin-alias.d.ts @@ -7,7 +7,5 @@ declare module '@rollup/plugin-alias' { } interface RollupPluginAliasOptions { - readonly entries: { - readonly [key: string]: string; - }; + readonly entries: Readonly<{ [key: string]: string }>; } diff --git a/tsconfig.json b/tsconfig.json index 4c80bcdd..d30a16c5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,51 +1,35 @@ { "compilerOptions": { - "target": "es2017", - "outDir": "build/main", - "rootDir": "src", + "target": "es2020", + "module": "esnext", "moduleResolution": "node", - "module": "commonjs", + "rootDir": "src", + "outDir": "build", + "incremental": true, + "tsBuildInfoFile": "./build/.tsbuildinfo", "declaration": true, "declarationMap": true, "sourceMap": true, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, "resolveJsonModule": true, - + "allowJs": true /* ajv validators are pre-compiled to JS */, "strict": true /* Enable all strict type-checking options. */, - - /* Strict Type-Checking Options */ - // "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, - // "strictNullChecks": true /* Enable strict null checks. */, - // "strictFunctionTypes": true /* Enable strict checking of function types. */, - // "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, - // "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, - // "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, - /* Additional Checks */ "noUnusedLocals": true /* Report errors on unused locals. */, "noUnusedParameters": true /* Report errors on unused parameters. */, "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - + // "exactOptionalPropertyTypes": true /* Enforce difference between `undefined` and optional properties */, // TODO: enable exactOptionalPropertyTypes, possibly waiting on https://github.com/microsoft/TypeScript/issues/46969#issuecomment-984083995 (or a `RequiredExactOptional` to match `PartialExactOptional`) + "noUncheckedIndexedAccess": true /* Require checking that an indexed access is not undefined */, // TODO: enable noUncheckedIndexedAccess + "noPropertyAccessFromIndexSignature": true /* Disallow dot syntax for fields which are not defined */, /* Debugging Options */ "traceResolution": false /* Report module resolution log messages. */, "listEmittedFiles": false /* Print names of generated files part of the compilation. */, "listFiles": false /* Print names of files part of the compilation. */, "pretty": true /* Stylize errors and messages using color and context. */, - - /* Experimental Options */ - // "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - // "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, - - "lib": [ - "es2017", - "esnext.bigint", - // TODO: remove after https://github.com/DefinitelyTyped/DefinitelyTyped/issues/24419 is resolved - "dom" - ], "typeRoots": ["node_modules/@types", "src/types"] }, - "include": ["src/**/*.ts"], + "include": ["src/**/*"], "exclude": ["node_modules/**"], "compileOnSave": false } diff --git a/yarn.lock b/yarn.lock index a15fd5f5..9beaa8f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,185 +2,199 @@ # yarn lockfile v1 -"@ava/typescript@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@ava/typescript/-/typescript-1.1.1.tgz#3dcaba3aced8026fdb584d927d809752854dc6e6" - integrity sha512-KbLUAe2cWXK63WLK6LnOJonjwEDU/8MNXCOA1ooX/YFZgKRmeAD1kZu+2K0ks5fnOCEcckNQAooyBNGdZUmMQA== +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== dependencies: - escape-string-regexp "^2.0.0" + "@jridgewell/trace-mapping" "^0.3.0" + +"@ava/typescript@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@ava/typescript/-/typescript-3.0.1.tgz#b89efbe000b800fa477c9613795b3ca6a53f7112" + integrity sha512-/JXIUuKsvkaneaiA9ckk3ksFTqvu0mDNlChASrTe2BnDsvMbhQdPWyqQjJ9WRJWVhhs5TWn1/0Pp1G6Rv8Syrw== + dependencies: + escape-string-regexp "^5.0.0" + execa "^5.1.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" + integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== "@babel/core@^7.7.5": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" + integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.9" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.9" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/generator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" + integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.17.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-compilation-targets@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" + integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.17.7" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: - "@babel/types" "^7.11.0" + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" + "@babel/types" "^7.16.7" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.17.0" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== +"@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.9" + "@babel/types" "^7.17.0" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.16.7": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" - integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== - -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" +"@babel/parser@^7.0.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" + integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" + integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.9" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.9" + "@babel/types" "^7.17.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.16.7", "@babel/types@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@bitjson/npm-scripts-info@^1.0.0": @@ -192,45 +206,356 @@ meow "^4.0.0" unquote "^1.1.0" -"@commitlint/execute-rule@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-9.1.1.tgz#59bfe018d85545881e4bd1a47f9cd155b2df4c2c" - integrity sha512-kCncHMXfVDfmUx1NExl7T+s7udAWEOh039DFGR9R5MWoy+zm2cJsCdsbWFFuNbcPWCKor57ywdIUN2t048P6Yg== +"@commitlint/config-validator@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d" + integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw== + dependencies: + "@commitlint/types" "^16.2.1" + ajv "^6.12.6" + +"@commitlint/execute-rule@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8" + integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g== "@commitlint/load@>6.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-9.1.1.tgz#8b1580ab821729bbe197e95f960e7cee966402ae" - integrity sha512-RCIX44M8nq3bW98vuxA6C2rM0wAnZlneFls2OVi5l2BvD/rsQ2R9CZYwPt/MYU6RbwMmlGhkuHdScwK6pJeUqA== - dependencies: - "@commitlint/execute-rule" "^9.1.1" - "@commitlint/resolve-extends" "^9.1.1" - "@commitlint/types" "^9.1.1" - chalk "4.1.0" - cosmiconfig "^6.0.0" - lodash "^4.17.15" + version "16.2.3" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-16.2.3.tgz#7b2e85af25a6f736f080ba08e7165738cedf8c8f" + integrity sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw== + dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/execute-rule" "^16.2.1" + "@commitlint/resolve-extends" "^16.2.1" + "@commitlint/types" "^16.2.1" + "@types/node" ">=12" + chalk "^4.0.0" + cosmiconfig "^7.0.0" + cosmiconfig-typescript-loader "^1.0.0" + lodash "^4.17.19" resolve-from "^5.0.0" + typescript "^4.4.3" -"@commitlint/resolve-extends@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-9.1.1.tgz#8ce703fcd2426ab1f5449906442267e18c995430" - integrity sha512-IxxNaSUT+dPhSCQPAMpQyHQlcSVikDxQWJFP6uwGJUU5rQff+0yQTuC3taWI2NWaATukjNWboAbH2vgBDnrDrg== +"@commitlint/resolve-extends@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360" + integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg== dependencies: + "@commitlint/config-validator" "^16.2.1" + "@commitlint/types" "^16.2.1" import-fresh "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/types@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-9.1.1.tgz#d97ebc35d20eed6d8458361cbca5c7cb85d45184" - integrity sha512-SXY8bCQ1qacJ8AUTUxjabY8G6OjSmMPLN9MBCzGaKOjpPNX6z8zbXTbk9oU3GHZLtcxweWLCi2n49IRS4iQlwg== +"@commitlint/types@^16.2.1": + version "16.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd" + integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA== + dependencies: + chalk "^4.0.0" + +"@cspell/cspell-bundled-dicts@^5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-5.20.0.tgz#294106a2660baf825494535019a0d2230c3cc0c1" + integrity sha512-tCO32xVSuey4Tg8XuayBzcrCAfrAXL8J1PeYl26+/ZUl5zkAL4AuyL0Cf4e2PpeEomnUWP2y5noZLLbUeOIwnw== + dependencies: + "@cspell/dict-ada" "^2.0.0" + "@cspell/dict-aws" "^2.0.0" + "@cspell/dict-bash" "^2.0.2" + "@cspell/dict-companies" "^2.0.4" + "@cspell/dict-cpp" "^2.0.3" + "@cspell/dict-cryptocurrencies" "^2.0.0" + "@cspell/dict-csharp" "^2.0.1" + "@cspell/dict-css" "^2.0.0" + "@cspell/dict-dart" "^1.1.0" + "@cspell/dict-django" "^2.0.0" + "@cspell/dict-dotnet" "^2.0.1" + "@cspell/dict-elixir" "^2.0.1" + "@cspell/dict-en-gb" "^1.1.33" + "@cspell/dict-en_us" "^2.2.2" + "@cspell/dict-filetypes" "^2.0.1" + "@cspell/dict-fonts" "^2.0.0" + "@cspell/dict-fullstack" "^2.0.5" + "@cspell/dict-git" "^1.0.1" + "@cspell/dict-golang" "^2.0.0" + "@cspell/dict-haskell" "^2.0.0" + "@cspell/dict-html" "^3.0.1" + "@cspell/dict-html-symbol-entities" "^2.0.0" + "@cspell/dict-java" "^2.0.0" + "@cspell/dict-latex" "^2.0.0" + "@cspell/dict-lorem-ipsum" "^2.0.0" + "@cspell/dict-lua" "^2.0.0" + "@cspell/dict-node" "^2.0.1" + "@cspell/dict-npm" "^2.0.3" + "@cspell/dict-php" "^2.0.0" + "@cspell/dict-powershell" "^2.0.0" + "@cspell/dict-public-licenses" "^1.0.4" + "@cspell/dict-python" "^3.0.3" + "@cspell/dict-r" "^1.0.2" + "@cspell/dict-ruby" "^2.0.1" + "@cspell/dict-rust" "^2.0.0" + "@cspell/dict-scala" "^2.0.0" + "@cspell/dict-software-terms" "^2.1.5" + "@cspell/dict-swift" "^1.0.2" + "@cspell/dict-typescript" "^2.0.0" + "@cspell/dict-vue" "^2.0.2" + +"@cspell/cspell-pipe@^5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-5.20.0.tgz#964aa560c89ecdf4eea9145700ccd6ab4c235ed8" + integrity sha512-dGHf4XZgPlGqviYTD+5ZwSk3hpiywsuuDqnoPo9SeQ1xPon7uFVKsMiAAzvhGAkkBaKIBNP/nwPU0feYvLoCJg== + +"@cspell/cspell-types@^5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-5.20.0.tgz#4c9a47249e1ad534938f2f35fbba1221e7800570" + integrity sha512-p06/HAKgalqyGHfnowJvjO3SQHxuOzKdiJTUlUi8x1CrEk7PmZEHuORlt9tVVZ46Xf2qY9+QLeTtattlWPJ39A== + +"@cspell/dict-ada@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-2.0.0.tgz#5d31967cbd7a0d12f4b4de3fd5b09e59239cf78b" + integrity sha512-4gfJEYXVwz6IN2LBaT6QoUV4pqaR35i0z0u9O684vLuVczvNJIHa4vNaSEFBr9d6xxncUyqstgP9P73ajJjh9A== + +"@cspell/dict-aws@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-2.0.0.tgz#9af72af4e59e96029dd4335271d87784843cb7dd" + integrity sha512-NKz7pDZ7pwj/b33i3f4WLpC1rOOUMmENwYgftxU+giU2YBeKM2wZbMTSEIzsrel56r0UlQYmdIVlP/B4nnVaoQ== + +"@cspell/dict-bash@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-2.0.2.tgz#8bc3e0a6c1b9c0df1bd9a1b7694c58d9843fd16b" + integrity sha512-ASIgI/LmV2TYrD4mtk+gm4XmUSTRomOyRt7NDWyBpEww/AeawC2O2NH6FosyUT6dUU3GaXt2wgJRN7R78n1SGg== + +"@cspell/dict-companies@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-2.0.4.tgz#2ba11418478d99d67a96004ea782a47a42c501a3" + integrity sha512-nLNVddo+iu4q/Mu03nkVTMnSPxBkoLyZ0MgpHJZWCqxVATbBkzoZNNNjsTkJhvkbrUIWydf8YW4U4wYY+kyh7Q== + +"@cspell/dict-cpp@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-2.0.3.tgz#551bec166c4520f7ba36f8d263fb885d19f98db0" + integrity sha512-aWRvI3CQW2M3XeJpDVffItw/9n4hxsN5EPwyBa6Po6EnCxZZZLOqpieZk4JNz4pH0/xbnOX+sMMuSeKWr71r/w== + +"@cspell/dict-cryptocurrencies@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-2.0.0.tgz#a74eecb42a46a96d08b6613fdb5c554529d3afff" + integrity sha512-nREysmmfOp7L2YCRAUufQahwD5/Punzb5AZ6eyg4zUamdRWHgBFphb5/9h2flt1vgdUfhc6hZcML21Ci7iXjaA== + +"@cspell/dict-csharp@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-2.0.1.tgz#86ec4fa42ba9a4cc57df28ec7a335b56bf751c5b" + integrity sha512-ZzAr+WRP2FUtXHZtfhe8f3j9vPjH+5i44Hcr5JqbWxmqciGoTbWBPQXwu9y+J4mbdC69HSWRrVGkNJ8rQk8pSw== + +"@cspell/dict-css@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-2.0.0.tgz#91dca013f16b51144eaea160e144b830f2dad027" + integrity sha512-MrFyswFHnPh4H0u6IlV4eHy+ZCUrrHzeL161LyTOqCvaKpbZavMgNYXzZqTF9xafO0iLgwKrl+Gkclu1KVBg0Q== + +"@cspell/dict-dart@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-1.1.0.tgz#d79689493debdad231efe495bd1460bff1d2f577" + integrity sha512-bBqZINm+RVjMgUrAhRzv/xx3jc3dkIqO0higPbsK+63IAtMNY3EiQnEO4eapbU+qAhyvICY9hZQZXy5Ux4p+Pw== + +"@cspell/dict-django@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-2.0.0.tgz#a5f5f693a686e5873f9dfb547ee3b3142ef760b1" + integrity sha512-GkJdJv6cmzrKcmq2/oxTXjKF5uv71r4eTqnFmgPbNBW1t+G4VYpzOf0QrVQrhx2RC4DdW5XfcTf+iS0FxHOTmw== + +"@cspell/dict-dotnet@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-2.0.1.tgz#8ef56df758b63f0a2ba4d8681a427a6861ed34d5" + integrity sha512-b1n4crJRW0WZVf9Gp/52j/tDtjYiZ3N81fIyfqPlBrjsh/5AivfA697DYwQ2mr8ngNX7RsqRtYNQjealA1rEnQ== + +"@cspell/dict-elixir@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-2.0.1.tgz#1a9b422215b5edabb84568cfa5c0c70bc164a2ce" + integrity sha512-eTTTxZt1FqGkM780yFDxsGHvTbWqvlK8YISSccK8FyrB6ULW+uflQlNS5AnWg3uWKC48b7pQott+odYCsPJ+Ow== + +"@cspell/dict-en-gb@^1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^2.2.2": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-2.2.4.tgz#20abce3eabe048aa5d858de7b9475c6c290cdc1e" + integrity sha512-gblsvIPLNAK+pRR/Mn2m2kRQLVFeoORQJeaZKlGHWckA3s0iuTN49hSSTbK66k3aWlzhirtSoux7IdvT2RpgnQ== + +"@cspell/dict-filetypes@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-2.0.1.tgz#a77467dad8fee31c28d623f85a15ce6fca3e2fdc" + integrity sha512-bQ7K3U/3hKO2lpQjObf0veNP/n50qk5CVezSwApMBckf/sAVvDTR1RGAvYdr+vdQnkdQrk6wYmhbshXi0sLDVg== + +"@cspell/dict-fonts@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-2.0.0.tgz#76e7781b44cdda6933144e15cba80e978c29bd15" + integrity sha512-AgkTalphfDPtKFPYmEExDcj8rRCh86xlOSXco8tehOEkYVYbksOk9XH0YVH34RFpy93YBd2nnVGLgyGVwagcPw== + +"@cspell/dict-fullstack@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-2.0.5.tgz#ffe416f90b0b30f1586e75432c0bc09b4c1faf96" + integrity sha512-jnLnHZ4HcCFNUfN+q7m0CUDtISNKat0Jahe1GgnAdEwzcozqKBhlGAjV7mQWPtKpqfJU61JakDnrxzqefAfZHw== + +"@cspell/dict-git@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-1.0.1.tgz#9de5ab2532abcdc8b10bd83ccb1f5e5dae0b6067" + integrity sha512-Rk+eTof/9inF11lvxmkCRK+gODatA3qai8kSASv6OG/JfPvpj7fTHErx/rdgPw/LOTDUafnoTjTYmj7B2MOQXg== + +"@cspell/dict-golang@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-2.0.0.tgz#a392533780c9fc3dc959f1358d09f7a6c6d82656" + integrity sha512-rUeZJR/S/ZjAsOURtxsAO6xDQhL0IzF458ScahaeOqe0zVL3tx7tCLikCgT92NWPs3BNqmsZGqYSDbn/1KsSIA== + +"@cspell/dict-haskell@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-2.0.0.tgz#9e7e58eba2b4633221650dcdcc43f73588b48119" + integrity sha512-cjX1Br+gSWqtcmJD/IMHz1UoP3pUaKIIKy/JfhEs7ANtRt6hhfEKe9dl2kQzDkkKt4pXol+YgdYxL/sVc/nLgQ== + +"@cspell/dict-html-symbol-entities@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-2.0.0.tgz#a25d39e62bd2dd7191ca5612714aa0a1b90ca10f" + integrity sha512-71S5wGCe7dq6C+zGDwsEAe5msub/irrLi6SExeG11a/EkpA3RKAEheDGPk0hOY4+vOcIFHaApxOjLTtgQfYWfA== + +"@cspell/dict-html@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-3.0.1.tgz#d5d10ef9b62361d8250cf9fe8564606993faa9df" + integrity sha512-sbuFd+nSjgbrGf5eYwSddFhm1eLLePKWyH6Zn8Zb0OODrBK5e4vGn1/scI/MOH5a2IvNs8W9wp84uMBFJcQZtw== + +"@cspell/dict-java@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-2.0.0.tgz#76252cee8f04e099ac6dae0f45f22257088060a7" + integrity sha512-9f5LDATlAiXRGqxLxgqbOLlQxuMW2zcN7tBgxwtN+4u90vM03ZUOR/gKIuDV/y0ZuAiWBIjA73cjk8DJ13Q1eA== + +"@cspell/dict-latex@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-2.0.0.tgz#0b13b6522d305f5842833ec0179078d900714f65" + integrity sha512-H6RRwbHhQ9ARoO1R57SDqB+q/J5jUDdVnkdfukJkA+HNlJBhCcDuzGOIJqr+GBkJYDkF3obZ3LEOk2lUfT+Eyg== + +"@cspell/dict-lorem-ipsum@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-2.0.0.tgz#47f2a9ec24808cdf8417457ae8f5a588f33c338c" + integrity sha512-jKogAKtqvgPMleL6usyj3rZ0m8sVUR6drrD+wMnWSfdx1BmUyTsYiuh/mPEfLAebaYHELWSLQG3rDZRvV9Riqg== + +"@cspell/dict-lua@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-2.0.0.tgz#b96d0363a28ac7e0483ad03edb21705c4f951459" + integrity sha512-7WUEBEspSKtsq104WdIys1+DLqAxpJPzw74Py1TuE3fI5GvlzeSZkRFP2ya54GB2lCO4C3mq4M8EnitpibVDfw== + +"@cspell/dict-node@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-2.0.1.tgz#eda891ebdbce83f20829cb6c85cd209da8cf5cdd" + integrity sha512-ztBWzhvI+YaMehICSJ65cohhjQqoztxf9vrS3YckOiVGBFvUMaFVNdX9klQkvrLcS/O4+2PzoGeIEkmf99amLA== + +"@cspell/dict-npm@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-2.0.3.tgz#044d71c36cf322f2816a77978bfd5dc21698667c" + integrity sha512-K/rnVhmHkR3jfdo7o8P2NDKyMcpVe9pUBiFDY1y2C0YqZXIxCz1f5hObm/hxyO+Vbn5VLU3TKU5fZ5z3LspXOg== + +"@cspell/dict-php@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-2.0.0.tgz#5d42f7df7c1da89fe19c2ccfe1bf61231d183990" + integrity sha512-29WgU77eTO985LvMHwPi1pcpfopfCWfTdffDyqya0JIfOSaFUrlYKzGPkE4mRxcz2G3hXsaM0SRvBNdIRwEdUg== -"@concordance/react@^2.0.0": +"@cspell/dict-powershell@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" - integrity sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA== + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-2.0.0.tgz#6e8ae7381b1928dfaf8f5a625f8fae6e8d93f224" + integrity sha512-6uvEhLiGmG3u9TFkM1TYcky6aL9Yk7Sk3KJwoTYBaQJY2KqrprgyQtW6yxIw9oU52VRHlq3KKvSAA9Q26+SIkQ== + +"@cspell/dict-public-licenses@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-1.0.4.tgz#13c2af357e7139bf3896eba58e0feb9f51053b3f" + integrity sha512-h4xULfVEDUeWyvp1OO19pcGDqWcBEQ7WGMp3QBHyYpjsamlzsyYYjCRSY2ZvpM7wruDmywSRFmRHJ/+uNFT7nA== + +"@cspell/dict-python@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-3.0.3.tgz#6c55ee768ffe93a828e607bcab437ccf78c494c6" + integrity sha512-Mt415KczTfqmLvKTgeV8FzMzpms9baTS0P5HfULTW+UxQtZeroviYyRM9TJPJKJSoI0ISu0GiIDgmYlV7+YPog== + +"@cspell/dict-r@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-1.0.2.tgz#4f21b240427e9bbaab8f82e0e20122d6b3cf7cee" + integrity sha512-Rp3d4sgD6izW9TW5yVI3D//3HTl9oOGBuzTvXRdoHksVPRvzIu2liVhj8MnQ3XIRe5Kc6IhLBAm6izuV2BpGwQ== + +"@cspell/dict-ruby@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-2.0.1.tgz#1cbd4d8803428bd421a5562b2d2bb4b3bae80bce" + integrity sha512-qGqhYfFeoBOashv/l0Kj5o4ilyvfq0s+t+r32juPOkOnbHz+hzxnJo2tMMg/L/UdjVV7Y8ovg4LDBC/seVrMYQ== + +"@cspell/dict-rust@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-2.0.0.tgz#89acc6c251164b09c424d23abb5ee560a4484ee6" + integrity sha512-EWlQivTKXMU3TTcq/Pi6KPKTQADknasQ700UrxRPzxhwQ4sKVZ88GDu6VZJlsbFUz8Vko289KS6wjiox/7WpmQ== + +"@cspell/dict-scala@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-2.0.0.tgz#b8098103bb03a13406c1c79f1769052353aafac4" + integrity sha512-MUwA2YKpqaQOSR4V1/CVGRNk8Ii5kf6I8Ch+4/BhRZRQXuwWbi21rDRYWPqdQWps7VNzAbbMA+PQDWsD5YY38g== + +"@cspell/dict-software-terms@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-2.1.5.tgz#4e2aa08839f37aa933cf1ac5196dbc7005bc8d3e" + integrity sha512-ylXWCsOJlYuucaMoHaHQLVaB8HeDrsCZ42a3jrTC/i6F/SF9I+4tBg4lMivd4w31bXBgILdbIvVHtWzJf+5m0A== + +"@cspell/dict-swift@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-1.0.2.tgz#8d8f7f7a5c8d7cbcdb46fcf4526938ce9cb687a4" + integrity sha512-IrMcRO7AYB2qU5cj4ttZyEbd04DRNOG6Iha106qGGmn4P096m+Y7lOnSLJx/rZbD/cAT3Z/7i465Lr1J93j7yg== + +"@cspell/dict-typescript@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-2.0.0.tgz#c1ce88dcb1b480623eb537670d11844047539a53" + integrity sha512-WFBahxsnD2y4Os14tE5Zxh31Ggn4DzGOAu3UoxYl1lLLxaszx4RH7LmAeFuznySboiaBeRBbpfJOjQA796O6VQ== + +"@cspell/dict-vue@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-2.0.2.tgz#8618b9f4825b3d80e1788082c19ac9c15832463e" + integrity sha512-/MB0RS0Gn01s4pgmjy0FvsLfr3RRMrRphEuvTRserNcM8XVtoIVAtrjig/Gg0DPwDrN8Clm0L1j7iQay6S8D0g== + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== dependencies: - arrify "^1.0.1" + "@cspotcode/source-map-consumer" "0.8.0" + +"@eslint/eslintrc@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.3.tgz#fcaa2bcef39e13d6e9e7f6271f4cc7cae1174886" + integrity sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -243,143 +568,145 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/nyc-config-typescript@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz#55172f5663b3635586add21b14d42ca94a163d58" - integrity sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ== +"@istanbuljs/nyc-config-typescript@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89" + integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w== dependencies: "@istanbuljs/schema" "^0.1.2" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@microsoft/api-documenter@^7.8.22": - version "7.8.22" - resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.8.22.tgz#0461a072161e1a32d85776df23f3d96fb44f6a25" - integrity sha512-Vsgx/sOPBn74PnkLhVN3yTg2ZiQc0cwrdxgKZCtfYLRh00qCTA/EhK+3cgIQqXf6ZPvvGj9VA5zMCpCHjC51dg== - dependencies: - "@microsoft/api-extractor-model" "7.8.13" - "@microsoft/tsdoc" "0.12.19" - "@rushstack/node-core-library" "3.26.1" - "@rushstack/ts-command-line" "4.4.6" + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@microsoft/api-documenter@^7.17.13": + version "7.17.13" + resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.17.13.tgz#a3b397f3192b584185077282693c01adbae2587a" + integrity sha512-EGH1M70QS/NibdlmC33/wj5a9rSbzdWNQekvd/RdD0nDB/tNOamjmaBISEOg5y7DFLn18sZhwDKD/Q9jtYtN3g== + dependencies: + "@microsoft/api-extractor-model" "7.17.3" + "@microsoft/tsdoc" "0.14.1" + "@rushstack/node-core-library" "3.45.5" + "@rushstack/ts-command-line" "4.11.0" colors "~1.2.1" js-yaml "~3.13.1" resolve "~1.17.0" -"@microsoft/api-extractor-model@7.8.13": - version "7.8.13" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.8.13.tgz#1a191db5216b8407d4b55487275bd19f8016c094" - integrity sha512-SspJ84pZEZfF5jcVkwtdmgpnxjwMwJxQkK+v868jF6Ue/rJZ7WV/+qFB76gxLXNPsnVhF/xdS8s4AWXL0ePN8g== - dependencies: - "@microsoft/tsdoc" "0.12.19" - "@rushstack/node-core-library" "3.26.1" - -"@microsoft/api-extractor@^7.9.3": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.9.3.tgz#b44aff3ad17926b83066b304b5f7de1c0acc62ca" - integrity sha512-8NXXmL+RhkHbL84lyFcjtqm6/IJxcGCckm2bIQFTyRjH4atshvpkuYy/IsTuRSuQ6XHEPa6QNze8IwEhhV5zPA== - dependencies: - "@microsoft/api-extractor-model" "7.8.13" - "@microsoft/tsdoc" "0.12.19" - "@rushstack/node-core-library" "3.26.1" - "@rushstack/ts-command-line" "4.4.6" +"@microsoft/api-extractor-model@7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.17.3.tgz#06899902ab1c10b85690232f21c1585cc158d983" + integrity sha512-ETslFxVEZTEK6mrOARxM34Ll2W/5H2aTk9Pe9dxsMCnthE8O/CaStV4WZAGsvvZKyjelSWgPVYGowxGVnwOMlQ== + dependencies: + "@microsoft/tsdoc" "0.14.1" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "3.45.5" + +"@microsoft/api-extractor@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.23.2.tgz#fb3c4a94751ba6759b8038d3405dda5da17c82b1" + integrity sha512-0LABOAmsHDomKihjoqLvY0mR1dh7R7fqB0O6qrjqAgQGBPxlRJCDH1tzFzlDS2OdeCxhMtFB3xd8EAr44huujg== + dependencies: + "@microsoft/api-extractor-model" "7.17.3" + "@microsoft/tsdoc" "0.14.1" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "3.45.5" + "@rushstack/rig-package" "0.3.11" + "@rushstack/ts-command-line" "4.11.0" colors "~1.2.1" lodash "~4.17.15" resolve "~1.17.0" semver "~7.3.0" source-map "~0.6.1" - typescript "~3.9.5" + typescript "~4.6.3" -"@microsoft/tsdoc-config@0.13.5": - version "0.13.5" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.13.5.tgz#2efeb27f5e4d191b8356aa4eb09e146c0813070c" - integrity sha512-KlnIdTRnPSsU9Coz9wzDAkT8JCLopP3ec1sgsgo7trwE6QLMKRpM4hZi2uzVX897SW49Q4f439auGBcQLnZQfA== +"@microsoft/tsdoc-config@0.16.1", "@microsoft/tsdoc-config@~0.16.1": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz#4de11976c1202854c4618f364bf499b4be33e657" + integrity sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ== dependencies: - "@microsoft/tsdoc" "0.12.20" - ajv "~6.12.3" + "@microsoft/tsdoc" "0.14.1" + ajv "~6.12.6" jju "~1.4.0" - resolve "~1.12.0" + resolve "~1.19.0" -"@microsoft/tsdoc@0.12.19": - version "0.12.19" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.19.tgz#2173ccb92469aaf62031fa9499d21b16d07f9b57" - integrity sha512-IpgPxHrNxZiMNUSXqR1l/gePKPkfAmIKoDRP9hp7OwjU29ZR8WCJsOJ8iBKgw0Qk+pFwR+8Y1cy8ImLY6e9m4A== +"@microsoft/tsdoc@0.14.1": + version "0.14.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz#155ef21065427901994e765da8a0ba0eaae8b8bd" + integrity sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw== -"@microsoft/tsdoc@0.12.20": - version "0.12.20" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.20.tgz#4261285f666ee0c0378f810585dd4ec5bbfa8852" - integrity sha512-/b13m37QZYPV6nCOiqkFyvlQjlTNvAcQpgFZ6ZKIqtStJxNdqVo/frULubxMUMWi6p9Uo5f4BRlguv5ViFcL0A== - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@rollup/plugin-alias@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.1.tgz#bb96cf37fefeb0a953a6566c284855c7d1cd290c" - integrity sha512-hNcQY4bpBUIvxekd26DBPgF7BT4mKVNDF5tBG4Zi+3IgwLxGYRY0itHs9D0oLVwXM5pvJDWJlBQro+au8WaUWw== +"@rollup/plugin-alias@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz#a5d267548fe48441f34be8323fb64d1d4a1b3fdf" + integrity sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw== dependencies: slash "^3.0.0" -"@rollup/plugin-commonjs@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz#4285f9ec2db686a31129e5a2b415c94aa1f836f0" - integrity sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw== +"@rollup/plugin-commonjs@^22.0.0": + version "22.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.0.tgz#f4d87016e2fbf187a593ab9f46626fe05b59e8bd" + integrity sha512-Ktvf2j+bAO+30awhbYoCaXpBcyPmJbaEUYClQns/+6SNCYFURbvBiNbWgHITEsIgDDWCDUclWRKEuf8cwZCFoQ== dependencies: - "@rollup/pluginutils" "^3.0.8" + "@rollup/pluginutils" "^3.1.0" commondir "^1.0.1" - estree-walker "^1.0.1" - glob "^7.1.2" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" -"@rollup/plugin-node-resolve@^8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz#261d79a680e9dc3d86761c14462f24126ba83575" - integrity sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ== +"@rollup/plugin-node-resolve@^13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" + integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== dependencies: "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deep-freeze "^0.0.1" deepmerge "^4.2.2" + is-builtin-module "^3.1.0" is-module "^1.0.0" - resolve "^1.17.0" + resolve "^1.19.0" -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": +"@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== @@ -388,229 +715,225 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rushstack/node-core-library@3.26.1": - version "3.26.1" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.26.1.tgz#1ba3e32954e25f1a2b368f1c06bfc1f127d60463" - integrity sha512-N2wewcrJS2Jut73qxi711D1OXVKd9+8YmCllcjxEN++88qqqxCQVnn6Iu9ydu79Frm5rV8p/zvHOLCeUm/mLOQ== +"@rushstack/node-core-library@3.45.5": + version "3.45.5" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz#00f92143cc21c3ad94fcd81ba168a40ac8cb77f2" + integrity sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg== dependencies: - "@types/node" "10.17.13" + "@types/node" "12.20.24" colors "~1.2.1" fs-extra "~7.0.1" + import-lazy "~4.0.0" jju "~1.4.0" + resolve "~1.17.0" semver "~7.3.0" timsort "~0.3.0" - z-schema "~3.18.3" + z-schema "~5.0.2" -"@rushstack/ts-command-line@4.4.6": - version "4.4.6" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.4.6.tgz#7818f19e444274e68564a756ef62a2b4e0ced0f8" - integrity sha512-ue3p2m773Yea/s4Ef2Q3gEyLd9T0NDjXCl+PlodGTrJHgxoiRwbROSWHAdYJL/LceGWa6Biqizu9qxUDEWFweQ== +"@rushstack/rig-package@0.3.11": + version "0.3.11" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.11.tgz#92a05929822610e8b42f2ad330d9ea20afae5165" + integrity sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw== + dependencies: + resolve "~1.17.0" + strip-json-comments "~3.1.1" + +"@rushstack/ts-command-line@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz#4cd3b9f59b41aed600042936260fdaa55ca0184d" + integrity sha512-ptG9L0mjvJ5QtK11GsAFY+jGfsnqHDS6CY6Yw1xT7a9bhjfNYnf6UPwjV+pF6UgiucfNcMDNW9lkDLxvZKKxMg== dependencies: "@types/argparse" "1.0.38" argparse "~1.0.9" colors "~1.2.1" + string-argv "~0.3.1" + +"@sindresorhus/chunkify@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/chunkify/-/chunkify-0.2.0.tgz#b3a7b881e8e63e343a99a1cbf662687f4268a4d8" + integrity sha512-mOAiwqu+bIIkNFDCXFJxZEmF9p9WHfSBbpLLmgysYnNkEs7aA0/AvU9+6zLHFqI7JnqdqwAuWu8CbGwGIszRdw== "@sindresorhus/df@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-1.0.1.tgz#c69b66f52f6fcdd287c807df210305dbaf78500d" integrity sha1-xptm9S9vzdKHyAffIQMF2694UA0= -"@sindresorhus/df@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-2.1.0.tgz#d208cf27e06f0bb476d14d7deccd7d726e9aa389" - integrity sha1-0gjPJ+BvC7R20U197M19cm6ao4k= +"@sindresorhus/df@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-3.1.1.tgz#94200f9277e4a7fdd35ce8ab8b6bc5b52b164d31" + integrity sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ== dependencies: - execa "^0.2.2" + execa "^2.0.1" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@stroncium/procfs@^1.0.0": +"@stroncium/procfs@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@stroncium/procfs/-/procfs-1.2.1.tgz#6b9be6fd20fb0a4c20e99a8695e083c699bb2b45" integrity sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA== -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3" - integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w== +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + "@types/argparse@1.0.38": version "1.0.38" resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== "@types/bn.js@*": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== dependencies: "@types/node" "*" "@types/body-parser@*": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" "@types/node" "*" -"@types/browserify@^12.0.33": - version "12.0.36" - resolved "https://registry.yarnpkg.com/@types/browserify/-/browserify-12.0.36.tgz#a7b662550bd4102b38ba83ef4ad6db871ea91331" - integrity sha512-hYXvPod5upkYTC7auziOATFsu/0MGxozbzNI80sZV044JTF7UtstHeNOM52b+bg7/taZ3fheK7oeb+jpm4C0/w== +"@types/browserify@^12.0.37": + version "12.0.37" + resolved "https://registry.yarnpkg.com/@types/browserify/-/browserify-12.0.37.tgz#f08312f17b4a7411441cce3a45434a0ce81c4da3" + integrity sha512-rGVZQhqlBMdnU0Wcq/RDO6+I1tppM42SqVq5ZEXiw2ft/A55Ro+dz4aKTy28gniwOIxZhRFqb5N+qnbg7J040g== dependencies: "@types/insert-module-globals" "*" "@types/node" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": - version "3.4.33" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" - integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== - -"@types/elliptic@^6.4.12": - version "6.4.12" - resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.12.tgz#e8add831f9cc9a88d9d84b3733ff669b68eaa124" - integrity sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw== +"@types/elliptic@^6.4.14": + version "6.4.14" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" + integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== dependencies: "@types/bn.js" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/estree@*": - version "0.0.45" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" - integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/express-serve-static-core@*": - version "4.17.9" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1" - integrity sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA== +"@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" -"@types/express@^4.17.7": - version "4.17.7" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" - integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== +"@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "*" + "@types/express-serve-static-core" "^4.17.18" "@types/qs" "*" "@types/serve-static" "*" -"@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - "@types/insert-module-globals@*": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@types/insert-module-globals/-/insert-module-globals-7.0.1.tgz#234f9263f6b315088287e3597d7e98033804a031" - integrity sha512-qtSfo/jdYHO4jNO6QCp4CwR/TPrvR39Yan5K4nPU1iCmxcnTWiERKDXcvFGuXEmfpjrHeOCvrZPa0UrUsy+mvA== + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/insert-module-globals/-/insert-module-globals-7.0.2.tgz#0d44216a6489829897d7c8a97dbf8250444c95f8" + integrity sha512-b+XCUBUioZoveg4e8+D/wGVIvQcuV6TNHPy53aeY0YBydOOZhAtX2Sdr4x97uWKKy9Xrt0SUKsPxbT9e0u/x9Q== dependencies: "@types/node" "*" -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/mime@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" - integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/minimist@^1.2.0", "@types/minimist@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/node@*": - version "14.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== +"@types/node@*", "@types/node@>=12": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" + integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== -"@types/node@10.17.13": - version "10.17.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.13.tgz#ccebcdb990bd6139cd16e84c39dc2fb1023ca90c" - integrity sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg== +"@types/node@12.20.24": + version "12.20.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" + integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/puppeteer@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-3.0.1.tgz#053ec20facc162b25a64785affccaa3e5817c607" - integrity sha512-t03eNKCvWJXhQ8wkc5C6GYuSqMEdKLOX0GLMGtks25YZr38wKZlKTwGM/BoAPVtdysX7Bb9tdwrDS1+NrW3RRA== +"@types/puppeteer@^5.4.6": + version "5.4.6" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.6.tgz#afc438e41dcbc27ca1ba0235ea464a372db2b21c" + integrity sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q== dependencies: "@types/node" "*" "@types/qs@*": - version "6.9.4" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.4.tgz#a59e851c1ba16c0513ea123830dd639a0a15cb6a" - integrity sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ== + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/resolve@1.17.1": version "1.17.1" @@ -620,124 +943,171 @@ "@types/node" "*" "@types/serve-static@*": - version "1.13.5" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" - integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" + "@types/mime" "^1" + "@types/node" "*" "@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.3.0.tgz#89518e5c5209a349bde161c3489b0ec187ae5d37" - integrity sha512-Ybx/wU75Tazz6nU2d7nN6ll0B98odoiYLXwcuwS5WSttGzK46t0n7TPRQ4ozwcTv82UY6TQoIvI+sJfTzqK9dQ== +"@typescript-eslint/eslint-plugin@^5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz#bc4cbcf91fbbcc2e47e534774781b82ae25cc3d8" + integrity sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA== dependencies: - "@typescript-eslint/experimental-utils" "3.3.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/type-utils" "5.23.0" + "@typescript-eslint/utils" "5.23.0" + debug "^4.3.2" functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.3.0.tgz#d72a946e056a83d4edf97f3411cceb639b0b8c87" - integrity sha512-d4pGIAbu/tYsrPrdHCQ5xfadJGvlkUxbeBB56nO/VGmEDi/sKmfa5fGty5t5veL1OyJBrUmSiRn1R1qfVDydrg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.3.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.8.0.tgz#ac1f7c88322dcfb7635ece6f0441516dd951099a" - integrity sha512-o8T1blo1lAJE0QDsW7nSyvZHbiDzQDjINJKyB44Z3sSL39qBy5L10ScI/XwDtaiunoyKGLiY9bzRk4YjsUZl8w== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.8.0" - "@typescript-eslint/typescript-estree" "3.8.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@^2.15.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.8.0.tgz#8e1dcd404299bf79492409c81c415fa95a7c622b" - integrity sha512-u5vjOBaCsnMVQOvkKCXAmmOhyyMmFFf5dbkM3TIbg3MZ2pyv5peE4gj81UAbTHwTOXEwf7eCQTUMKrDl/+qGnA== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.8.0" - "@typescript-eslint/types" "3.8.0" - "@typescript-eslint/typescript-estree" "3.8.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/types@3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.8.0.tgz#58581dd863f86e0cd23353d94362bb90b4bea796" - integrity sha512-8kROmEQkv6ss9kdQ44vCN1dTrgu4Qxrd2kXr10kz2NP5T8/7JnEfYNxCpPkArbLIhhkGLZV3aVMplH1RXQRF7Q== - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.23.0.tgz#443778e1afc9a8ff180f91b5e260ac3bec5e2de1" + integrity sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw== + dependencies: + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz#79c7fb8598d2942e45b3c881ced95319818c7980" + integrity sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg== + dependencies: + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" + +"@typescript-eslint/scope-manager@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz#4305e61c2c8e3cfa3787d30f54e79430cc17ce1b" + integrity sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw== + dependencies: + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" + +"@typescript-eslint/type-utils@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz#f852252f2fc27620d5bb279d8fed2a13d2e3685e" + integrity sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw== + dependencies: + "@typescript-eslint/utils" "5.23.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/types@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.20.0.tgz#fa39c3c2aa786568302318f1cb51fcf64258c20c" + integrity sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg== + +"@typescript-eslint/types@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.23.0.tgz#8733de0f58ae0ed318dbdd8f09868cdbf9f9ad09" + integrity sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw== + +"@typescript-eslint/typescript-estree@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz#ab73686ab18c8781bbf249c9459a55dc9417d6b0" + integrity sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w== + dependencies: + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/visitor-keys" "5.20.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz#dca5f10a0a85226db0796e8ad86addc9aee52065" + integrity sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg== + dependencies: + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@^4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.3.0.tgz#841ffed25c29b0049ebffb4c2071268a34558a2a" - integrity sha512-3SqxylENltEvJsjjMSDCUx/edZNSC7wAqifUU1Ywp//0OWEZwMZJfecJud9XxJ/40rAKEbJMKBOQzeOjrLJFzQ== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.8.0.tgz#0606d19f629f813dbdd5a34c7a1e895d6191cac6" - integrity sha512-MTv9nPDhlKfclwnplRNDL44mP2SY96YmPGxmMbMy6x12I+pERcxpIUht7DXZaj4mOKKtet53wYYXU0ABaiXrLw== - dependencies: - "@typescript-eslint/types" "3.8.0" - "@typescript-eslint/visitor-keys" "3.8.0" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/visitor-keys@3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.8.0.tgz#ad35110249fb3fc30a36bfcbfeea93e710cfaab1" - integrity sha512-gfqQWyVPpT9NpLREXNR820AYwgz+Kr1GuF3nf1wxpHD6hdxI62tq03ToomFnDxY0m3pUB39IF7sil7D5TQexLA== - dependencies: - eslint-visitor-keys "^1.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.23.0.tgz#4691c3d1b414da2c53d8943310df36ab1c50648a" + integrity sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/utils@^5.10.2": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.20.0.tgz#b8e959ed11eca1b2d5414e12417fd94cae3517a5" + integrity sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.20.0" + "@typescript-eslint/types" "5.20.0" + "@typescript-eslint/typescript-estree" "5.20.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@typescript-eslint/visitor-keys@5.20.0": + version "5.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz#70236b5c6b67fbaf8b2f58bf3414b76c1e826c2a" + integrity sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg== + dependencies: + "@typescript-eslint/types" "5.20.0" + eslint-visitor-keys "^3.0.0" + +"@typescript-eslint/visitor-keys@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz#057c60a7ca64667a39f991473059377a8067c87b" + integrity sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg== + dependencies: + "@typescript-eslint/types" "5.23.0" + eslint-visitor-keys "^3.0.0" JSONStream@^1.0.3, JSONStream@^1.0.4: version "1.3.5" @@ -747,18 +1117,18 @@ JSONStream@^1.0.3, JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.34" + negotiator "0.6.3" -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: version "1.8.2" @@ -769,62 +1139,91 @@ acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: acorn-walk "^7.0.0" xtend "^4.0.2" -acorn-walk@^7.0.0, acorn-walk@^7.2.0: +acorn-walk@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.0.0, acorn@^7.3.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== +acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.4.1, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== - agent-base@6: - version "6.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" - integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@~6.12.3: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +aggregate-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.0.tgz#83dbdb53a0d500721281d22e19eee9bc352a89cd" + integrity sha512-8DGp7zUt1E9k0NE2q4jlXHk+V3ORErmwolEdRz9iV+LKJ40WhMHh92cxAvhqV2I+zEn/gotIoqoMs0NjF3xofg== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ajv-cli@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ajv-cli/-/ajv-cli-5.0.0.tgz#78956ed2934e6dde4c9e696b587be1c2998862e8" + integrity sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ== + dependencies: + ajv "^8.0.0" + fast-json-patch "^2.0.0" + glob "^7.1.0" + js-yaml "^3.14.0" + json-schema-migrate "^2.0.0" + json5 "^2.1.3" + minimist "^1.2.0" + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6, ajv@~6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== +ajv@^8.0.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: - string-width "^3.0.0" - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" ansi-escapes@^3.2.0: version "3.2.0" @@ -832,43 +1231,57 @@ ansi-escapes@^3.2.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +ansi-styles@^6.0.0, ansi-styles@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" +app-module-path@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" + integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= + append-transform@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" @@ -893,26 +1306,16 @@ argparse@^1.0.7, argparse@~1.0.9: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -928,16 +1331,23 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" -array-union@^1.0.1, array-union@^1.0.2: +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -954,27 +1364,15 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" arrgv@^1.0.2: version "1.0.2" @@ -986,24 +1384,25 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== asmcrypto.js@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz#b9f84bd0a1fb82f21f8c29cc284a707ad17bba2e" integrity sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" assert@^1.4.0: version "1.5.0" @@ -1013,146 +1412,113 @@ assert@^1.4.0: object-assign "^4.1.1" util "0.10.3" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-module-types@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" + integrity sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +ast-module-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-3.0.0.tgz#9a6d8a80f438b6b8fe4995699d700297f398bf81" + integrity sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ== async@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +ava-fast-check@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ava-fast-check/-/ava-fast-check-5.0.0.tgz#409233a05072634f98c28e1a34ea2af567b5f607" + integrity sha512-ZXXVVJ74KntRkG1Iolgiia+UUNU/uN8PZpvae3BiuZVkGW9oyhuy3FUHEEzjYvpkwK7gzNw0rUzsuyLidXPNSQ== -ava-fast-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ava-fast-check/-/ava-fast-check-2.0.0.tgz#e78b6c119ef0894cf3e9a8f28b9bddd3c4ae0107" - integrity sha512-4CN3GjpUXeGHeyaEhzI77F85+du4r+t8irBEJpYKgPiK95vPpQDN3mBfYOgsVGEWVrYAr6WMNzlsJBSk2xi/GQ== - -ava@^3.11.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.11.1.tgz#580bfc974b858fb13f7ce948b9651da4e5b17bc8" - integrity sha512-yGPD0msa5Qronw7GHDNlLaB7oU5zryYtXeuvny40YV6TMskSghqK7Ky3NisM/sr+aqI3DY7sfmORx8dIWQgMoQ== - dependencies: - "@concordance/react" "^2.0.0" - acorn "^7.3.1" - acorn-walk "^7.2.0" - ansi-styles "^4.2.1" +ava@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-4.2.0.tgz#50c954cb32fd433b01d1e8245ea2f5cfb6e4412d" + integrity sha512-96N/rH2ZlBjoh18CsjH3zfo/rzukkRoqNK7R/Z3MLRrqu6cRRf+i4Zwna7ZRYEIl55yF1BKh/nSPCZWqoXfPJA== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + ansi-styles "^6.1.0" arrgv "^1.0.2" - arrify "^2.0.1" - callsites "^3.1.0" - chalk "^4.1.0" - chokidar "^3.4.1" + arrify "^3.0.0" + callsites "^4.0.0" + cbor "^8.1.0" + chalk "^5.0.0" + chokidar "^3.5.3" chunkd "^2.0.1" - ci-info "^2.0.0" + ci-info "^3.3.0" ci-parallel-vars "^1.0.1" clean-yaml-object "^0.1.0" - cli-cursor "^3.1.0" - cli-truncate "^2.1.0" - code-excerpt "^3.0.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" common-path-prefix "^3.0.0" - concordance "^5.0.0" - convert-source-map "^1.7.0" + concordance "^5.0.4" currently-unhandled "^0.4.1" - debug "^4.1.1" - del "^5.1.0" - emittery "^0.7.1" - equal-length "^1.0.0" - figures "^3.2.0" - globby "^11.0.1" + debug "^4.3.3" + del "^6.0.0" + emittery "^0.10.1" + figures "^4.0.0" + globby "^13.1.1" ignore-by-default "^2.0.0" - import-local "^3.0.2" - indent-string "^4.0.0" + indent-string "^5.0.0" is-error "^2.2.2" - is-plain-object "^4.1.1" + is-plain-object "^5.0.0" is-promise "^4.0.0" - lodash "^4.17.19" - matcher "^3.0.0" - md5-hex "^3.0.1" - mem "^6.1.0" - ms "^2.1.2" - ora "^4.0.5" - p-map "^4.0.0" - picomatch "^2.2.2" - pkg-conf "^3.1.0" - plur "^4.0.0" - pretty-ms "^7.0.0" - read-pkg "^5.2.0" + matcher "^5.0.0" + mem "^9.0.2" + ms "^2.1.3" + p-event "^5.0.1" + p-map "^5.3.0" + picomatch "^2.3.1" + pkg-conf "^4.0.0" + plur "^5.1.0" + pretty-ms "^7.0.1" resolve-cwd "^3.0.0" slash "^3.0.0" - source-map-support "^0.5.19" - stack-utils "^2.0.2" - strip-ansi "^6.0.0" - supertap "^1.0.0" + stack-utils "^2.0.5" + strip-ansi "^7.0.1" + supertap "^3.0.1" temp-dir "^2.0.0" - trim-off-newlines "^1.0.1" - update-notifier "^4.1.0" - write-file-atomic "^3.0.3" - yargs "^15.4.1" + write-file-atomic "^4.0.1" + yargs "^17.3.1" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypto@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.2.0.tgz#7cc944d2cc2b7beeff04c74f8611a001612a981d" - integrity sha512-yy+kDrUG6aXP7NIYq7kKIwlrXtx/51488IGfuqhyM6FYF8zNI1mPRwvAPvQ1RfE5e7WW7fVdZt4yHlmN4HJ4Hg== +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypto@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.4.0.tgz#4046f0c44a4b301eff84de593b4f86fce8d91db2" + integrity sha512-KDX2CR29o6ZoqpQndcCxFZAtYA1jDMnXU3jmCfzP44g++Cu7AHHtZN/JbrN/MXAg9SLvtQ8XISG+eVD9zH1+Jg== dependencies: bufio "~1.0.7" - loady "~0.0.1" + loady "~0.0.5" -bech32@=1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" - integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== +bech32@=2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== benchmark@^2.1.0: version "2.1.4" @@ -1162,41 +1528,58 @@ benchmark@^2.1.0: lodash "^4.17.4" platform "^1.3.3" -binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== +bigi@^1.1.0, bigi@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" + integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= -bitcore-lib-cash@^8.22.0: - version "8.22.0" - resolved "https://registry.yarnpkg.com/bitcore-lib-cash/-/bitcore-lib-cash-8.22.0.tgz#697527621aa3cfbe31e2904c2f2304061ad0b21b" - integrity sha512-1cWPl+g48gemxJO5YuW4TdaCUVa0Pgxe7AV2wXtJU68gISY7XU4X0q/9e5lA29gQknZTqocrZBy6ZBeztgwc8Q== - dependencies: - bitcore-lib "^8.22.0" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bip-schnorr@=0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/bip-schnorr/-/bip-schnorr-0.6.4.tgz#6fde7f301fe6b207dbd05f8ec2caf08fa5a51d0d" + integrity sha512-dNKw7Lea8B0wMIN4OjEmOk/Z5qUGqoPDY0P2QttLqGk1hmDPytLWW8PR5Pb6Vxy6CprcdEgfJpOjUu+ONQveyg== + dependencies: + bigi "^1.4.2" + ecurve "^1.0.6" + js-sha256 "^0.9.0" + randombytes "^2.1.0" + safe-buffer "^5.2.1" + +bitcore-lib-cash@^8.25.28: + version "8.25.28" + resolved "https://registry.yarnpkg.com/bitcore-lib-cash/-/bitcore-lib-cash-8.25.28.tgz#cc14709580432446f28cea793efe42d1d813112b" + integrity sha512-Zaue7z/iDdQDTNsDoX8LkxH04/pCpHKpSgbxJe2D/2n1YLi1JtzOl9Ox4agYQtR/k9SWCg4p8qJ1W7lVWVP8+A== + dependencies: + bitcore-lib "^8.25.28" bn.js "=4.11.8" bs58 "^4.0.1" buffer-compare "=1.1.1" - elliptic "=6.4.0" + elliptic "^6.5.3" inherits "=2.0.1" - lodash "=4.17.15" + lodash "^4.17.20" -bitcore-lib@^8.22.0: - version "8.22.0" - resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-8.22.0.tgz#1a0a87f9cdadd737348835798e4fb9428db3e8b9" - integrity sha512-cwAuf3xk3ztpgOE0QUvApYddNwKE4/PfCPPReel/+c/ShruekRhBHUKunZJvoYISjS7YhbfkppYSjsuxO9d/ZQ== +bitcore-lib@^8.25.28: + version "8.25.28" + resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-8.25.28.tgz#6841715e187bf2d9038eb803216bd3e50eeb5497" + integrity sha512-UrNHh0Ba8GUiHUYRmm2IKlb8eomsbvk/Z6oQdaOPQoLiamiKnu45pAMqtcHg06wMDF8at54oIdoD2WEU+TQujw== dependencies: - bech32 "=1.1.3" + bech32 "=2.0.0" + bip-schnorr "=0.6.4" bn.js "=4.11.8" bs58 "^4.0.1" buffer-compare "=1.1.1" - elliptic "=6.4.0" + elliptic "^6.5.3" inherits "=2.0.1" - lodash "=4.17.15" + lodash "^4.17.20" -bl@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" - integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" inherits "^2.0.4" @@ -1208,54 +1591,42 @@ bluebird@^3.4.0: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== blueimp-md5@^2.10.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96" - integrity sha512-x5PKJHY5rHQYaADj6NwPUR2QRCUVSggPzrUKkeENpj871o9l9IefJbO2jkT5UvYykeOK9dx0VmkIo6dZ+vThYw== + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== bn.js@=4.11.8: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" - integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -1265,30 +1636,21 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -1305,13 +1667,6 @@ browser-pack@^6.0.1: through2 "^2.0.0" umd "^3.0.0" -browser-resolve@^1.11.0: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - browser-resolve@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" @@ -1351,11 +1706,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -1380,15 +1735,15 @@ browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@16.5.1: - version "16.5.1" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.1.tgz#3c13c97436802930d5c3ae28658ddc33bfd37dc2" - integrity sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A== +browserify@17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" + integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== dependencies: JSONStream "^1.0.3" assert "^1.4.0" browser-pack "^6.0.1" - browser-resolve "^1.11.0" + browser-resolve "^2.0.0" browserify-zlib "~0.2.0" buffer "~5.2.1" cached-path-relative "^1.0.0" @@ -1397,31 +1752,31 @@ browserify@16.5.1: constants-browserify "~1.0.0" crypto-browserify "^3.0.0" defined "^1.0.0" - deps-sort "^2.0.0" + deps-sort "^2.0.1" domain-browser "^1.2.0" duplexer2 "~0.1.2" - events "^2.0.0" + events "^3.0.0" glob "^7.1.0" has "^1.0.0" htmlescape "^1.1.0" https-browserify "^1.0.0" inherits "~2.0.1" - insert-module-globals "^7.0.0" + insert-module-globals "^7.2.1" labeled-stream-splicer "^2.0.0" mkdirp-classic "^0.5.2" - module-deps "^6.0.0" + module-deps "^6.2.3" os-browserify "~0.3.0" parents "^1.0.1" - path-browserify "~0.0.0" + path-browserify "^1.0.0" process "~0.11.0" punycode "^1.3.2" querystring-es3 "~0.2.0" read-only-stream "^2.0.0" readable-stream "^2.0.2" resolve "^1.1.4" - shasum "^1.0.0" + shasum-object "^1.0.0" shell-quote "^1.6.1" - stream-browserify "^2.0.0" + stream-browserify "^3.0.0" stream-http "^3.0.0" string_decoder "^1.1.1" subarg "^1.0.0" @@ -1430,10 +1785,21 @@ browserify@16.5.1: timers-browserify "^1.0.1" tty-browserify "0.0.1" url "~0.11.0" - util "~0.10.1" + util "~0.12.0" vm-browserify "^1.0.0" xtend "^4.0.0" +browserslist@^4.17.5: + version "4.20.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" + integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== + dependencies: + caniuse-lite "^1.0.30001317" + electron-to-chromium "^1.4.84" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -1452,9 +1818,9 @@ buffer-crc32@~0.2.3: integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" @@ -1462,12 +1828,12 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^5.2.1, buffer@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" buffer@~5.2.1: version "5.2.1" @@ -1482,53 +1848,25 @@ bufio@~1.0.7: resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.0.7.tgz#b7f63a1369a0829ed64cc14edf0573b3e382a33e" integrity sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A== -builtin-modules@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== +builtin-modules@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" - integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" + integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== cachedir@2.2.0: version "2.2.0" @@ -1545,23 +1883,23 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" +callsites@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.0.0.tgz#8014cea4fedfe681a30e2f7d2d557dd95808a92a" + integrity sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ== camelcase-keys@^4.0.0: version "4.2.0" @@ -1581,10 +1919,15 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= +camelcase-keys@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" + integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== + dependencies: + camelcase "^6.3.0" + map-obj "^4.1.0" + quick-lru "^5.1.1" + type-fest "^1.2.1" camelcase@^4.1.0: version "4.1.0" @@ -1596,18 +1939,22 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== +camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +caniuse-lite@^1.0.30001317: + version "1.0.30001332" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" + integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + nofilter "^3.1.0" chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -1618,33 +1965,38 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" chownr@^1.1.1: version "1.1.4" @@ -1668,10 +2020,10 @@ chunkd@^2.0.1: resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-2.0.1.tgz#49cd1d7b06992dc4f7fccd962fe2a101ee7da920" integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== ci-parallel-vars@^1.0.1: version "1.0.1" @@ -1686,30 +2038,30 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.1.0.tgz#5ce5a2fd19a12aecdce8570daefddb7ac94b6b4e" + integrity sha512-dxXQYI7mfQVcaF12s6sjNFoZ6ZPDQuBBLp3QJ5156k9EvUFClUoZ11fo8HnLQO241DDVntHEug8MOuFO5PSfRg== + dependencies: + escape-string-regexp "5.0.0" + clean-yaml-object@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= -cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" cli-cursor@^2.1.0: version "2.1.0" @@ -1725,18 +2077,18 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" - integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" + slice-ansi "^5.0.0" + string-width "^5.0.0" cli-width@^2.0.0: version "2.2.1" @@ -1752,43 +2104,37 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - mimic-response "^1.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -code-excerpt@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" - integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== dependencies: - convert-to-spaces "^1.0.1" + convert-to-spaces "^2.0.1" -codecov@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.7.2.tgz#998e68c8c1ef4b55cfcf11cd456866d35e13d693" - integrity sha512-fmCjAkTese29DUX3GMIi4EaKGflHa4K51EoMc29g8fBHawdk/+KEq5CWOeXLdd9+AT7o1wO4DIpp/Z1KCqCz1g== +codecov@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.8.3.tgz#9c3e364b8a700c597346ae98418d09880a3fdbe7" + integrity sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA== dependencies: argv "0.0.2" - ignore-walk "3.0.3" - js-yaml "3.13.1" - teeny-request "6.0.1" - urlgrey "0.4.4" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" + ignore-walk "3.0.4" + js-yaml "3.14.1" + teeny-request "7.1.1" + urlgrey "1.0.0" color-convert@^1.9.0: version "1.9.3" @@ -1809,7 +2155,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -1829,42 +2175,48 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -commander@^2.18.0, commander@^2.20.3, commander@^2.7.1: +commander@^2.16.0, commander@^2.18.0, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -comment-json@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-3.0.2.tgz#a5652a491910e338080bcbf98fc9a37cbd7f3733" - integrity sha512-ysJasbJ671+8mPEmwLOfLFqxoGtSmjyoep+lKRVH4J1/hsGu79fwetMDQWk8de8mVgqDZ43D7JuJAlACqjI1pg== +commander@^9.0.0, commander@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + +comment-json@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.2.tgz#5fae70a94e0c8f84a077bd31df5aa5269252f293" + integrity sha512-H8T+kl3nZesZu41zO2oNXIJWojNeK3mHxCLrsBNu6feksBXsgb+PtYz5daP5P86A0F3sz3840KVYehr04enISQ== dependencies: - core-util-is "^1.0.2" + array-timsort "^1.0.3" + core-util-is "^1.0.3" esprima "^4.0.1" has-own-prop "^2.0.0" repeat-string "^1.6.1" commitizen@^4.0.3: - version "4.1.2" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.1.2.tgz#6095eb825fd3f0d3611df88e6803c69b23307e9a" - integrity sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.2.4.tgz#a3e5b36bd7575f6bf6e7aa19dbbf06b0d8f37165" + integrity sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw== dependencies: cachedir "2.2.0" cz-conventional-changelog "3.2.0" dedent "0.7.0" detect-indent "6.0.0" - find-node-modules "2.0.0" + find-node-modules "^2.1.2" find-root "1.1.0" fs-extra "8.1.0" glob "7.1.4" - inquirer "6.5.0" + inquirer "6.5.2" is-utf8 "^0.2.1" - lodash "4.17.15" + lodash "^4.17.20" minimist "1.2.5" strip-bom "4.0.0" strip-json-comments "3.0.1" @@ -1879,18 +2231,13 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -compare-func@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.4.tgz#6b07c4c5e8341119baf44578085bda0f4a823516" - integrity sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q== +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" - dot-prop "^3.0.0" - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + dot-prop "^5.1.0" concat-map@0.0.1: version "0.0.1" @@ -1917,10 +2264,10 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concordance@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.0.tgz#6d4552f76c78301dd65e748c26af2cf131f9dd49" - integrity sha512-stOCz9ffg0+rytwTaL2njUOIyMfANwfwmqc9Dr4vTUS/x/KkVFlWx9Zlzu6tHYtjKxxaCF/cEAZgPDac+n35sg== +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== dependencies: date-time "^3.1.0" esutils "^2.0.3" @@ -1931,7 +2278,7 @@ concordance@^5.0.0: semver "^7.3.2" well-known-symbols "^2.0.0" -configstore@^5.0.0, configstore@^5.0.1: +configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== @@ -1953,42 +2300,37 @@ constants-browserify@~1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -conventional-changelog-angular@^5.0.10: - version "5.0.10" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz#5cf7b00dd315b6a6a558223c80d5ef24ddb34205" - integrity sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA== +conventional-changelog-angular@^5.0.12: + version "5.0.13" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" + integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-atom@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.7.tgz#221575253a04f77a2fd273eb2bf29a138f710abf" - integrity sha512-7dOREZwzB+tCEMjRTDfen0OHwd7vPUdmU0llTy1eloZgtOP4iSLVzYIQqfmdRZEty+3w5Jz+AbhfTJKoKw1JeQ== +conventional-changelog-atom@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz#a759ec61c22d1c1196925fca88fe3ae89fd7d8de" + integrity sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw== dependencies: q "^1.5.1" -conventional-changelog-codemirror@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.7.tgz#d6b6a8ce2707710c5a036e305037547fb9e15bfb" - integrity sha512-Oralk1kiagn3Gb5cR5BffenWjVu59t/viE6UMD/mQa1hISMPkMYhJIqX+CMeA1zXgVBO+YHQhhokEj99GP5xcg== +conventional-changelog-codemirror@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz#398e9530f08ce34ec4640af98eeaf3022eb1f7dc" + integrity sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw== dependencies: q "^1.5.1" @@ -1997,70 +2339,78 @@ conventional-changelog-config-spec@2.1.0: resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz#874a635287ef8b581fd8558532bf655d4fb59f2d" integrity sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ== -conventional-changelog-conventionalcommits@4.3.0, conventional-changelog-conventionalcommits@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz#c4205a659f7ca9d7881f29ee78a4e7d6aeb8b3c2" - integrity sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg== +conventional-changelog-conventionalcommits@4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz#f4c0921937050674e578dc7875f908351ccf4014" + integrity sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" -conventional-changelog-core@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.7.tgz#6b5cdadda4430895cc4a75a73dd8b36e322ab346" - integrity sha512-UBvSrQR2RdKbSQKh7RhueiiY4ZAIOW3+CSWdtKOwRv+KxIMNFKm1rOcGBFx0eA8AKhGkkmmacoTWJTqyz7Q0VA== +conventional-changelog-conventionalcommits@^4.5.0: + version "4.6.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" + integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + +conventional-changelog-core@^4.2.1: + version "4.2.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" + integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== dependencies: add-stream "^1.0.0" - conventional-changelog-writer "^4.0.16" - conventional-commits-parser "^3.1.0" + conventional-changelog-writer "^5.0.0" + conventional-commits-parser "^3.2.0" dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "2.0.0" + get-pkg-repo "^4.0.0" + git-raw-commits "^2.0.8" git-remote-origin-url "^2.0.0" - git-semver-tags "^4.0.0" + git-semver-tags "^4.1.1" lodash "^4.17.15" - normalize-package-data "^2.3.5" + normalize-package-data "^3.0.0" q "^1.5.1" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - shelljs "^0.8.3" - through2 "^3.0.0" + through2 "^4.0.0" -conventional-changelog-ember@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.8.tgz#f0f04eb7ff3c885af97db100865ab95dcfa9917f" - integrity sha512-JEMEcUAMg4Q9yxD341OgWlESQ4gLqMWMXIWWUqoQU8yvTJlKnrvcui3wk9JvnZQyONwM2g1MKRZuAjKxr8hAXA== +conventional-changelog-ember@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz#619b37ec708be9e74a220f4dcf79212ae1c92962" + integrity sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A== dependencies: q "^1.5.1" -conventional-changelog-eslint@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.8.tgz#f8b952b7ed7253ea0ac0b30720bb381f4921b46c" - integrity sha512-5rTRltgWG7TpU1PqgKHMA/2ivjhrB+E+S7OCTvj0zM/QGg4vmnVH67Vq/EzvSNYtejhWC+OwzvDrLk3tqPry8A== +conventional-changelog-eslint@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz#689bd0a470e02f7baafe21a495880deea18b7cdb" + integrity sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA== dependencies: q "^1.5.1" -conventional-changelog-express@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.5.tgz#6e93705acdad374516ca125990012a48e710f8de" - integrity sha512-pW2hsjKG+xNx/Qjof8wYlAX/P61hT5gQ/2rZ2NsTpG+PgV7Rc8RCfITvC/zN9K8fj0QmV6dWmUefCteD9baEAw== +conventional-changelog-express@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz#420c9d92a347b72a91544750bffa9387665a6ee8" + integrity sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ== dependencies: q "^1.5.1" -conventional-changelog-jquery@^3.0.10: - version "3.0.10" - resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.10.tgz#fe8eb6aff322aa980af5eb68497622a5f6257ce7" - integrity sha512-QCW6wF8QgPkq2ruPaxc83jZxoWQxLkt/pNxIDn/oYjMiVgrtqNdd7lWe3vsl0hw5ENHNf/ejXuzDHk6suKsRpg== +conventional-changelog-jquery@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz#d142207400f51c9e5bb588596598e24bba8994bf" + integrity sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw== dependencies: q "^1.5.1" -conventional-changelog-jshint@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.7.tgz#955a69266951cd31e8afeb3f1c55e0517fdca943" - integrity sha512-qHA8rmwUnLiIxANJbz650+NVzqDIwNtc0TcpIa0+uekbmKHttidvQ1dGximU3vEDdoJVKFgR3TXFqYuZmYy9ZQ== +conventional-changelog-jshint@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz#f2d7f23e6acd4927a238555d92c09b50fe3852ff" + integrity sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-preset-loader@^2.3.4: @@ -2068,37 +2418,36 @@ conventional-changelog-preset-loader@^2.3.4: resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== -conventional-changelog-writer@^4.0.16: - version "4.0.16" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz#ca10f2691a8ea6d3c2eb74bd35bcf40aa052dda5" - integrity sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ== +conventional-changelog-writer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" + integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.6" + conventional-commits-filter "^2.0.7" dateformat "^3.0.0" - handlebars "^4.7.6" + handlebars "^4.7.7" json-stringify-safe "^5.0.1" lodash "^4.17.15" - meow "^7.0.0" + meow "^8.0.0" semver "^6.0.0" split "^1.0.0" - through2 "^3.0.0" - -conventional-changelog@3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.21.tgz#4a774e6bf503acfd7e4685bb750da8c0eccf1e0d" - integrity sha512-ZGecVZPEo3aC75VVE4nu85589dDhpMyqfqgUM5Myq6wfKWiNqhDJLSDMsc8qKXshZoY7dqs1hR0H/15kI/G2jQ== - dependencies: - conventional-changelog-angular "^5.0.10" - conventional-changelog-atom "^2.0.7" - conventional-changelog-codemirror "^2.0.7" - conventional-changelog-conventionalcommits "^4.3.0" - conventional-changelog-core "^4.1.7" - conventional-changelog-ember "^2.0.8" - conventional-changelog-eslint "^3.0.8" - conventional-changelog-express "^2.0.5" - conventional-changelog-jquery "^3.0.10" - conventional-changelog-jshint "^2.0.7" + through2 "^4.0.0" + +conventional-changelog@3.1.24: + version "3.1.24" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.24.tgz#ebd180b0fd1b2e1f0095c4b04fd088698348a464" + integrity sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg== + dependencies: + conventional-changelog-angular "^5.0.12" + conventional-changelog-atom "^2.0.8" + conventional-changelog-codemirror "^2.0.8" + conventional-changelog-conventionalcommits "^4.5.0" + conventional-changelog-core "^4.2.1" + conventional-changelog-ember "^2.0.9" + conventional-changelog-eslint "^3.0.9" + conventional-changelog-express "^2.0.6" + conventional-changelog-jquery "^3.0.11" + conventional-changelog-jshint "^2.0.9" conventional-changelog-preset-loader "^2.3.4" conventional-commit-types@^3.0.0: @@ -2106,45 +2455,44 @@ conventional-commit-types@^3.0.0: resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== -conventional-commits-filter@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz#0935e1240c5ca7698329affee1b6a46d33324c4c" - integrity sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw== +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4" - integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA== +conventional-commits-parser@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" - meow "^7.0.0" - split2 "^2.0.0" - through2 "^3.0.0" - trim-off-newlines "^1.0.0" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" -conventional-recommended-bump@6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.9.tgz#49ee74f52fbafcc63e89e2297d020279fea318f0" - integrity sha512-DpRmW1k8CpRrcsXHOPGgHgOd4BMGiq2gtXAveGM8B9pSd9b4r4WKnqp1Fd0vkDtk8l973mIk8KKKUYnKRr9SFw== +conventional-recommended-bump@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== dependencies: concat-stream "^2.0.0" conventional-changelog-preset-loader "^2.3.4" - conventional-commits-filter "^2.0.6" - conventional-commits-parser "^3.1.0" - git-raw-commits "2.0.0" - git-semver-tags "^4.0.0" - meow "^7.0.0" + conventional-commits-filter "^2.0.7" + conventional-commits-parser "^3.2.0" + git-raw-commits "^2.0.8" + git-semver-tags "^4.1.1" + meow "^8.0.0" q "^1.5.1" convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -2153,85 +2501,76 @@ convert-source-map@~1.1.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= -convert-to-spaces@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-util-is@^1.0.3, core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -core-util-is@^1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig-typescript-loader@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" + integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== + dependencies: + cosmiconfig "^7" + ts-node "^10.7.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" - -cp-file@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== - dependencies: - graceful-fs "^4.1.2" - make-dir "^2.0.0" - nested-error-stacks "^2.0.0" - pify "^4.0.1" - safe-buffer "^5.0.1" + yaml "^1.10.0" -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== +cp-file@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-9.1.0.tgz#e98e30db72d57d47b5b1d444deb70d05e5684921" + integrity sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA== dependencies: graceful-fs "^4.1.2" make-dir "^3.0.0" nested-error-stacks "^2.0.0" p-event "^4.1.0" -cpy-cli@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-3.1.1.tgz#2adb06544102c948ce098e522d5b8ddcf4f7c0b4" - integrity sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg== +cpy-cli@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-4.1.0.tgz#64ce7e23e095a4961539f89da6413f5deb8a62f6" + integrity sha512-JA6bth6/mxPCa19SrWkIuPEBrea8vO9g1v0qhmCLnAKOfTcsNk5/X3W1o9aZuOHgugRcxdyR67rO4Gw/DA+4Qg== dependencies: - cpy "^8.0.0" - meow "^6.1.1" + cpy "^9.0.0" + meow "^10.1.2" -cpy@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.0.tgz#e8ac07f3caeb0113bd55326e5cda052c19fa6c60" - integrity sha512-XwlImkjPxMr01qXqC564VD4rfcDQ2eKtYmFlCy0ixsLRJ1cwYVUBh+v47jsQTO1IrmvdjqO813VpDQ0JiTuOdA== - dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" +cpy@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-9.0.1.tgz#7f3ad0ad5bafe0bc70645c4bb567969927cadb9f" + integrity sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg== + dependencies: + arrify "^3.0.0" + cp-file "^9.1.0" + globby "^13.1.1" + junk "^4.0.0" + micromatch "^4.0.4" nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" + p-filter "^3.0.0" + p-map "^5.3.0" create-ecdh@^4.0.0: version "4.0.4" @@ -2264,13 +2603,17 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - integrity sha1-hF/wwINKPe2dFg2sptOQkGuyiMw= +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: - lru-cache "^4.0.0" - which "^1.2.8" + node-fetch "2.6.7" cross-spawn@^6.0.5: version "6.0.5" @@ -2281,312 +2624,113 @@ cross-spawn@^6.0.5: path-key "^2.0.1" semver "^5.5.0" shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.0.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -cspell-dict-aws@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/cspell-dict-aws/-/cspell-dict-aws-1.0.5.tgz#538af5c2e3d3be9cae6f5ea73aa141a1f2d2aa34" - integrity sha512-yhOi7YiPuMS+2YPZgZmmwU4U3YPUxF+2TypYXF7eoIjzpNdKrag7r6B2i9lgSttCj6I1oWdjIEmNsAap4Affkw== - dependencies: - configstore "^5.0.0" - -cspell-dict-bash@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cspell-dict-bash/-/cspell-dict-bash-1.0.3.tgz#e3cf0e2dbe56f18c68a16c3eb8037d418e88c3cd" - integrity sha512-pEGuoZXhgqhpmmvdEoNY/XYDrypI37y0Z09VgKTHEblzTHo++vLyd4Z8r1SY3kJ2eQejduz4IL7ZGXqgtEp2vw== - dependencies: - configstore "^5.0.0" - -cspell-dict-companies@^1.0.22: - version "1.0.22" - resolved "https://registry.yarnpkg.com/cspell-dict-companies/-/cspell-dict-companies-1.0.22.tgz#a30983605888ce530e5c7c2ad1b2b9e33c20fcae" - integrity sha512-P7ziSCteONYjlPHFFqZTnisSEJr9h9FXTJh0t9QQIoKcaNR4wij5GiZDv4p4YubCf0z3GeJ7Uao+99RGeHakRQ== - dependencies: - configstore "^5.0.0" - -cspell-dict-cpp@^1.1.26: - version "1.1.26" - resolved "https://registry.yarnpkg.com/cspell-dict-cpp/-/cspell-dict-cpp-1.1.26.tgz#67e3f8d26ec2c49d305b086013935f0b0fade2e0" - integrity sha512-ywY7X6UzC5BC7fQhyRAwZHurl52GjwnY6D2wG57JJ/bcT5IsJOWpLAjHORtUH2AcCp6BSAKR6wxl6/bqSuKHJw== - dependencies: - configstore "^5.0.0" - -cspell-dict-cryptocurrencies@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cspell-dict-cryptocurrencies/-/cspell-dict-cryptocurrencies-1.0.2.tgz#301773a9b555d4c3173f442b0770483874ec36dd" - integrity sha512-suLIsOGmeHt+lqRBbbOJM9aVeBNcXq+3kKINOyuFiAJFpRhDMQrnATzGmW0hhi8XaJHFBcSeQY7iQYe3u1WbnA== - dependencies: - configstore "^5.0.0" - -cspell-dict-django@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/cspell-dict-django/-/cspell-dict-django-1.0.15.tgz#a0faec617cab280bd9ef942d1b2a6a5634e5c143" - integrity sha512-heppo6ZEGgv+cVPDLr24miG8xIn3E5SEGFBGHyNLyGqt8sHzeG3eNKhjKOJCC0hG/fq0ZECbE5q4691LvH24/Q== - dependencies: - configstore "^5.0.0" - -cspell-dict-dotnet@^1.0.14: - version "1.0.14" - resolved "https://registry.yarnpkg.com/cspell-dict-dotnet/-/cspell-dict-dotnet-1.0.14.tgz#780c3143d340e3211be27df7cfd2d9d1f82b24c5" - integrity sha512-gTuh94tNAVMS4XmVCK2AsFgKp2mXBk2b8+f2GLCw2K8HY6QUHlvOJg051JJrZABRW/lAoquKZuqssSo9B1mgng== - dependencies: - configstore "^5.0.0" - -cspell-dict-elixir@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/cspell-dict-elixir/-/cspell-dict-elixir-1.0.13.tgz#f3d08b27d2ee2a25fcae5050820d5680028e95d5" - integrity sha512-KWDO4NeV3QuMlZxSWpN0sPiFN4GE5AzlDi75eSKRvq/f1+pxgxgXQ5zLNPnDbr2EOSJBV34paZwI+7PvCiTTgA== - dependencies: - configstore "^5.0.0" - -cspell-dict-en-gb@^1.1.16: - version "1.1.16" - resolved "https://registry.yarnpkg.com/cspell-dict-en-gb/-/cspell-dict-en-gb-1.1.16.tgz#75155e43c21e972ac2f60117b69fd53b5701335f" - integrity sha512-PBzHF40fVj+6Adm3dV3/uhkE2Ptu8W+WJ28socBDDpEfedFMwnC0rpxvAgmKJlLc0OYsn07/yzRnt9srisNrLg== - dependencies: - configstore "^5.0.0" - -cspell-dict-en_us@^1.2.26: - version "1.2.26" - resolved "https://registry.yarnpkg.com/cspell-dict-en_us/-/cspell-dict-en_us-1.2.26.tgz#7e9b9bcbc1b9d3cd7d0442d6264cefdc3cbf8fe1" - integrity sha512-v/9yHpi4J8KAThUa1mtGfhUsv8GXB5lZnKae7ZDN4pzjx5O+KgzZ6GGEUvRlMVzBOl0vEmNInTSIKTG1Y3h4lg== - dependencies: - configstore "^5.0.0" - -cspell-dict-fonts@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/cspell-dict-fonts/-/cspell-dict-fonts-1.0.5.tgz#df96979e07d68cd186fe20eae0113e939d880c4f" - integrity sha512-R9A/MVDzqEQbwXaZhmNJ7bSzzkH5YSJ5UDr3wDRk7FXzNNcuJ4J9WRbkDjCDnoVfg0kCx0FeEp0fme+PbLTeng== - dependencies: - configstore "^5.0.0" - -cspell-dict-fullstack@^1.0.23: - version "1.0.23" - resolved "https://registry.yarnpkg.com/cspell-dict-fullstack/-/cspell-dict-fullstack-1.0.23.tgz#c933e3987edf6e81e85bf58ca31e574ff79f9d0c" - integrity sha512-vc/aihpKVD/ML+SLVry6kDWFswW/sQfP9QHrr2ZhQLUwhj9pVMnZvx+u1cV8bhMYltWQZxrDhdAe4jrlBrxLHA== - dependencies: - configstore "^5.0.0" - -cspell-dict-golang@^1.1.14: - version "1.1.14" - resolved "https://registry.yarnpkg.com/cspell-dict-golang/-/cspell-dict-golang-1.1.14.tgz#5567d823a3e58b8f4c783bea185e95580008d47e" - integrity sha512-V9TQQjoTgdLTpLNczEjoF+BO+CkdmuZlD6J71SCT8sczSP0FLz4QkL1MpqiL0lhdnbtASsjs+oCF53Y+dWdh9g== - dependencies: - configstore "^5.0.0" - -cspell-dict-haskell@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cspell-dict-haskell/-/cspell-dict-haskell-1.0.4.tgz#98a3a00fb72d39f3b94aa019fac7ed86ab73dbd8" - integrity sha512-Wy5EE446icPbsi8bLqSCOtxS5Z6QDLGNBvz6Nh+yvuLf7Nb8mU6NQmfSYH/yMfJoVGa5bpcmv8pQtJV4I2E5Tg== - dependencies: - configstore "^5.0.0" - -cspell-dict-html-symbol-entities@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/cspell-dict-html-symbol-entities/-/cspell-dict-html-symbol-entities-1.0.13.tgz#41b770fa08f82b20f9e3c7f234a320bbb1dee851" - integrity sha512-u8BARt4r5rdUee7Yw6ejsD69WLib9l+pyBr4UUIZovhCUccddm2LkS9GDJUqWtCf/frZpoTnmpuW/NPWVVG6pQ== - dependencies: - configstore "^5.0.0" - -cspell-dict-java@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/cspell-dict-java/-/cspell-dict-java-1.0.12.tgz#d0220153984a0ccf6bbd69617f324ab11ce4a3fe" - integrity sha512-9pg5IrCEZGlWLgv8qGjxzzca19egfBYrbnuiWhJNLbBGBOTWrwYjFqbLQtMJReXUtWikWLY0KCzRZlCGusr7bw== - dependencies: - configstore "^5.0.0" - -cspell-dict-latex@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/cspell-dict-latex/-/cspell-dict-latex-1.0.13.tgz#cdbbc2ebda7b82d44a3574d53b6f5b9a6d0644bb" - integrity sha512-UZqGJQ82mkzseqdF7kWXIrA07VD91W7rWx16DCThDBMohOsFdvCymUUgr0pM90FuqmldSiD+Gi1FayDSyPdNtQ== - dependencies: - configstore "^5.0.0" - -cspell-dict-lorem-ipsum@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/cspell-dict-lorem-ipsum/-/cspell-dict-lorem-ipsum-1.0.10.tgz#3828f43b4df35b258d5d31e4e539c2f6d3f3ce14" - integrity sha512-UlboQ3xH+D3l+hemLO4J5yz8EM60SH91f1dJIy2s94AeePZXtwYh1hTFM5dEsXI2CAQkfTu3ZdPWflLsInPfrA== - dependencies: - configstore "^5.0.0" - -cspell-dict-lua@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/cspell-dict-lua/-/cspell-dict-lua-1.0.8.tgz#733c3f908a818d08aadb360ace20ff2f8d9a0585" - integrity sha512-zPQoZxcKRbtO7dpWh02zO5kCElzJIqkgjAV209q03k7NoS1n0kAcV48W0agY6T1OR0ZjDWMkUheaLFDbaMJq3g== - dependencies: - configstore "^5.0.0" - -cspell-dict-php@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/cspell-dict-php/-/cspell-dict-php-1.0.13.tgz#83cdab21e52d036303b321bf9bca27a9820661a6" - integrity sha512-RP5XST+hWEqWxlLISS3sXxsQa2YXOWx8X5LcxQHvEGdb1hMNypXxw9V53th7S+hfUTPKJrbUIzckYZp4j8TS4A== - dependencies: - configstore "^5.0.0" - -cspell-dict-powershell@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cspell-dict-powershell/-/cspell-dict-powershell-1.0.6.tgz#2cd32028fb2c7894f4eb7ff202eeec02a8138825" - integrity sha512-rwxt/fG3Nr7tQaV7e38ilz8qWfXrf5Ie+MQC6Mw/ddjT4wLOkGvruUqtJA/USoDE9PFG12KoarFsWlVXv/nwPA== - dependencies: - configstore "^5.0.0" - -cspell-dict-python@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/cspell-dict-python/-/cspell-dict-python-1.0.20.tgz#39509b4cbaf5cbe9b5ceab9440eeeb42c04f6323" - integrity sha512-BiV8LnH9YNxvkUbVwTyDpZhOuRjPr8cE+nxpuPDbCHmVJmlLsDlg8MXTcJH8I+OFjoz6YdBX6yqK1bi55Aioow== - dependencies: - configstore "^5.0.0" - -cspell-dict-ruby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cspell-dict-ruby/-/cspell-dict-ruby-1.0.3.tgz#bbda30306af9c9274b8848005d9f73f1d3513651" - integrity sha512-uFxUyGj9SRASfnd75lcpkoNvMYHNWmqkFmS9ZruL61M1RmFx9eekuEY74nK11qsb/E4o6yPtGAQH4SrotF9SwQ== - dependencies: - configstore "^5.0.0" + which "^1.2.9" -cspell-dict-rust@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/cspell-dict-rust/-/cspell-dict-rust-1.0.12.tgz#323eedd0137d8019df08f02d9c1956d9778d0baa" - integrity sha512-bMt70/aQL2OcadZRtWfPIF/mHWX9JNOGq92UUU2ka+9C3OPBP/TuyYiHhUWt67y/CoIyEQ7/5uAtjX8paLf14w== +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - configstore "^5.0.0" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -cspell-dict-scala@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/cspell-dict-scala/-/cspell-dict-scala-1.0.11.tgz#42533b2c850fe6eb64946708fd19e66824b842a7" - integrity sha512-bmAQjapvcceJaiwGTkBd9n2L9GaqpmFDKe5S19WQDsWqjFiDwQ+r47td3TU7yWjOLPqp72h9X/XGzDJFvQEPcg== +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: - configstore "^5.0.0" + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" -cspell-dict-software-terms@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/cspell-dict-software-terms/-/cspell-dict-software-terms-1.0.10.tgz#8aa6fe2c6979810675e1dadee035404f71538a1e" - integrity sha512-buww9OWunaLwRBiJ+gHW7DLoqMtSbHR6sP3DkvjSZBeke3KxAyS2HmsXPTPVrHFrbqm6qCDmGBs442HZcUz3Iw== - dependencies: - configstore "^5.0.0" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -cspell-dict-typescript@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/cspell-dict-typescript/-/cspell-dict-typescript-1.0.5.tgz#7e375a6f694b9a925647e5a5696cc992e5411339" - integrity sha512-bp4rf3/N02Q6JJhJyDcmCtzn9L00nRBQaar3uxRR7lHz3JfIPujUpTXpJN+iuhhcBv8jL1bKTd5wCpfRyHSi1g== +cspell-gitignore@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-5.20.0.tgz#0c4f405559383663a9c24fab5cf829e7b19abed5" + integrity sha512-oWzoHcaidX6jFON6vwiH3cA1HqkGmawD1DWt+fPWKrea9/SuTcvFxm+RbqO4DjwXEAMIczyPOWo+SCM0VbcCrA== dependencies: - configstore "^5.0.0" + cspell-glob "^5.20.0" + find-up "^5.0.0" -cspell-glob@^0.1.19: - version "0.1.19" - resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-0.1.19.tgz#e6076918a4e17a26f9be19d81198437bbc74126e" - integrity sha512-mWWXtKZIsbbUcFKscHEHc2o3fG7VWLqx46ooqbNVnItSZ/jJgPSuguvKh3L6avPY3KKmef2Loae7bjchDwZ+Mw== +cspell-glob@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-5.20.0.tgz#2bda5cc90bc6694ce2eb1a5aaee54196fc9b37a9" + integrity sha512-eyo8NYH4GapHxfilMarwvf1HIyGWT3gWuFlYkmQjYVx3KjzmfR1Y1x9S068wmwjp9kKCu9T6Vj71EGG+9R59Lw== dependencies: - micromatch "^4.0.2" + micromatch "^4.0.5" -cspell-io@^4.0.22: - version "4.0.22" - resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-4.0.22.tgz#fec7000e34394cd9a4795f606ddddcb7b0838145" - integrity sha512-cjkCHgLZftGPmGe6eSh+FQpQPCxou7t/MjwuCTY8ZeqI55veCF9uCWk8BI4lKbvDjkp6HxgU1T4mighvKY3/wA== - dependencies: - iconv-lite "^0.4.24" - iterable-to-stream "^1.0.1" +cspell-io@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-5.20.0.tgz#2f7fc676a068acc641f3bd77ddca7f72985b6ee5" + integrity sha512-wgqqpVIhtMh+/+3YfHt8cDfrD7OLF+xQlStlURj8AJwEJ0xu16zyI9S5zcig+83+0QyzuMdxfZiMgbdQxWEvOg== -cspell-lib@^4.1.29: - version "4.1.29" - resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-4.1.29.tgz#40a028a7b2675d7f6ecd45f1eab8d9310f5456ea" - integrity sha512-NQTxLhPPObvPg2MJmu1pVJG5fEaytHhhHjHhbdfh6gFTUKdBwQTwxprL+9ySRBPpxm9x7BgqGchJpDa7UbENyQ== +cspell-lib@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-5.20.0.tgz#0eb5797cb32ce03db7ad7e14649296c434e3d142" + integrity sha512-Fc7+3ExF2pNS8BsQTXSMkhR6ITbpyiMQf+y4ZH/aBml09+O6lrbj4j2tJx/oR4XvDEA8uQkV/5lMGdU+otC1KQ== dependencies: - comment-json "^3.0.2" + "@cspell/cspell-bundled-dicts" "^5.20.0" + "@cspell/cspell-pipe" "^5.20.0" + "@cspell/cspell-types" "^5.20.0" + clear-module "^4.1.2" + comment-json "^4.2.2" configstore "^5.0.1" - cspell-dict-aws "^1.0.5" - cspell-dict-bash "^1.0.3" - cspell-dict-companies "^1.0.22" - cspell-dict-cpp "^1.1.26" - cspell-dict-cryptocurrencies "^1.0.2" - cspell-dict-django "^1.0.15" - cspell-dict-dotnet "^1.0.14" - cspell-dict-elixir "^1.0.13" - cspell-dict-en-gb "^1.1.16" - cspell-dict-en_us "^1.2.26" - cspell-dict-fonts "^1.0.5" - cspell-dict-fullstack "^1.0.23" - cspell-dict-golang "^1.1.14" - cspell-dict-haskell "^1.0.4" - cspell-dict-html-symbol-entities "^1.0.13" - cspell-dict-java "^1.0.12" - cspell-dict-latex "^1.0.13" - cspell-dict-lorem-ipsum "^1.0.10" - cspell-dict-lua "^1.0.8" - cspell-dict-php "^1.0.13" - cspell-dict-powershell "^1.0.6" - cspell-dict-python "^1.0.20" - cspell-dict-ruby "^1.0.3" - cspell-dict-rust "^1.0.12" - cspell-dict-scala "^1.0.11" - cspell-dict-software-terms "^1.0.10" - cspell-dict-typescript "^1.0.5" - cspell-io "^4.0.22" - cspell-trie-lib "^4.1.10" - cspell-util-bundle "^4.0.12" - fs-extra "^9.0.0" + cosmiconfig "^7.0.1" + cspell-glob "^5.20.0" + cspell-io "^5.20.0" + cspell-trie-lib "^5.20.0" + fast-equals "^3.0.2" + find-up "^5.0.0" + fs-extra "^10.1.0" gensequence "^3.1.1" - minimatch "^3.0.4" - vscode-uri "^2.1.1" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + vscode-languageserver-textdocument "^1.0.4" + vscode-uri "^3.0.3" -cspell-trie-lib@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-4.1.10.tgz#a55b5ac525d948a6004bed08bf475ab7aa3719ec" - integrity sha512-KRcHfdzWQz5W4M4WstzjFDGS8EM7nxGOVXTOq1mNXsT2DkoOemVPI0gIUWLGHcuZuXAj90dkqzEWNk6wZ9v9+w== +cspell-trie-lib@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-5.20.0.tgz#3a13ba0477a36ecb16311e85b270bcc2b4300f37" + integrity sha512-ET95dJh+OJ04PdLI9dKqAa+dDu47tXcUxCR6uKiZ+qZ18v1Zl986s8q89m9c+xpo7Leqh0rF6Zsw3M9Cjy6Jhw== dependencies: + "@cspell/cspell-pipe" "^5.20.0" + fs-extra "^10.1.0" gensequence "^3.1.1" -cspell-util-bundle@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/cspell-util-bundle/-/cspell-util-bundle-4.0.12.tgz#ac0389535998dba4363126218e3cbbade85bbe2d" - integrity sha512-qrqbgSF4Uci/E5q7q95Wd00RrVj6NTABbJGE8qNTMcLfBLezVy0zj+eHdLe7dTkx4oHob2N3WrMBBE3xBhzg/g== - -cspell@^4.0.63: - version "4.0.63" - resolved "https://registry.yarnpkg.com/cspell/-/cspell-4.0.63.tgz#af42bed1a149c5fed9beb69b7b57e25c5a0ec38d" - integrity sha512-dF0oq69CrTFArISxKhih5p8Mcb1RihzQcQ5LnQnuY66Df/qtyScCMvPgg+G/gUtLPa2RYb3WSy8surZNVS2c0Q== - dependencies: - chalk "^2.4.2" - commander "^2.20.3" - comment-json "^3.0.2" - cspell-glob "^0.1.19" - cspell-lib "^4.1.29" - fs-extra "^9.0.0" - gensequence "^3.1.1" - get-stdin "^7.0.0" - glob "^7.1.6" - minimatch "^3.0.4" +cspell@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-5.20.0.tgz#580909fc1283aeda43f1c583188ea046417d340b" + integrity sha512-lXAS14ZlfJfOI3FgoAAfyl/AlTB8T+ayHmKrHxwuRRUvN4IBT4y8d7tdjWDj7/bsM4u5M5WrlAXg6vXH3Fg5bA== + dependencies: + "@cspell/cspell-pipe" "^5.20.0" + chalk "^4.1.2" + commander "^9.2.0" + cspell-gitignore "^5.20.0" + cspell-glob "^5.20.0" + cspell-lib "^5.20.0" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^6.0.1" + fs-extra "^10.1.0" + get-stdin "^8.0.0" + glob "^8.0.1" + imurmurhash "^0.1.4" + semver "^7.3.7" + strip-ansi "^6.0.1" + vscode-uri "^3.0.3" currently-unhandled@^0.4.1: version "0.4.1" @@ -2595,7 +2739,7 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cz-conventional-changelog@3.2.0, cz-conventional-changelog@^3.2.0: +cz-conventional-changelog@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz#6aef1f892d64113343d7e455529089ac9f20e477" integrity sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg== @@ -2609,12 +2753,24 @@ cz-conventional-changelog@3.2.0, cz-conventional-changelog@^3.2.0: optionalDependencies: "@commitlint/load" ">6.1.1" -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= +cz-conventional-changelog@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== dependencies: - number-is-nan "^1.0.0" + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dash-ast@^1.0.0: version "1.0.0" @@ -2633,17 +2789,24 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" @@ -2655,22 +2818,15 @@ decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" +decamelize@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" + integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== dedent@0.7.0: version "0.7.0" @@ -2682,15 +2838,17 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-freeze@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" - integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge-ts@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-4.0.3.tgz#495b11315d082fc715e101a1b0e41cbb136becfb" + integrity sha512-kRBBqKdfhdZ+LEBkyE0Y7Yu7Lm277HOKpVmpecaEzzD3Krne9uO13Wqi7sNJ9S4FDmCgwjiWj8UhXo5OgjOIwg== + dependencies: + is-plain-object "^5.0.0" deepmerge@^4.2.2: version "4.2.2" @@ -2711,65 +2869,55 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" + globby "^11.0.1" + graceful-fs "^4.2.4" is-glob "^4.0.1" is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" slash "^3.0.0" -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-tree@^8.1.1: + version "8.1.2" + resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-8.1.2.tgz#c9e652984f53bd0239bc8a3e50cbd52f05b2e770" + integrity sha512-c4CL1IKxkKng0oT5xrg4uNiiMVFqTGOXqHSFx7XEFdgSsp6nw3AGGruICppzJUrfad/r7GLqt26rmWU4h4j39A== + dependencies: + commander "^2.20.3" + debug "^4.3.1" + filing-cabinet "^3.0.1" + precinct "^8.0.0" + typescript "^3.9.7" -deps-sort@^2.0.0: +deps-sort@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== @@ -2787,26 +2935,115 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-indent@6.0.0, detect-indent@^6.0.0: +detect-indent@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detective-amd@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-3.1.2.tgz#bf55eb5291c218b76d6224a3d07932ef13a9a357" + integrity sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ== + dependencies: + ast-module-types "^3.0.0" + escodegen "^2.0.0" + get-amd-module-type "^3.0.0" + node-source-walk "^4.2.0" + +detective-cjs@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-3.1.3.tgz#50e107d67b37f459b0ec02966ceb7e20a73f268b" + integrity sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ== + dependencies: + ast-module-types "^3.0.0" + node-source-walk "^4.0.0" + +detective-es6@^2.2.0, detective-es6@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-2.2.2.tgz#ee5f880981d9fecae9a694007029a2f6f26d8d28" + integrity sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw== + dependencies: + node-source-walk "^4.0.0" + +detective-less@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detective-less/-/detective-less-1.0.2.tgz#a68af9ca5f69d74b7d0aa190218b211d83b4f7e3" + integrity sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA== + dependencies: + debug "^4.0.0" + gonzales-pe "^4.2.3" + node-source-walk "^4.0.0" + +detective-postcss@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-4.0.0.tgz#24e69b465e5fefe7a6afd05f7e894e34595dbf51" + integrity sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A== + dependencies: + debug "^4.1.1" + is-url "^1.2.4" + postcss "^8.1.7" + postcss-values-parser "^2.0.1" + +detective-postcss@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-5.1.1.tgz#ec23ac3818f8be95ac3a38a8b9f3b6d43103ef87" + integrity sha512-YJMsvA0Y6/ST9abMNcQytl9iFQ2bfu4I7B74IUiAvyThfaI9Y666yipL+SrqfReoIekeIEwmGH72oeqX63mwUw== + dependencies: + is-url "^1.2.4" + postcss "^8.4.6" + postcss-values-parser "^5.0.0" + +detective-sass@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-3.0.2.tgz#e0f35aac79a4d2f6409c284d95b8f7ecd5973afd" + integrity sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^4.0.0" + +detective-scss@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-2.0.2.tgz#7d2a642616d44bf677963484fa8754d9558b8235" + integrity sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^4.0.0" + +detective-stylus@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.3.tgz#20a702936c9fd7d4203fd7a903314b5dd43ac713" + integrity sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q== + +detective-typescript@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-7.0.2.tgz#c6e00b4c28764741ef719662250e6b014a5f3c8e" + integrity sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA== + dependencies: + "@typescript-eslint/typescript-estree" "^4.33.0" + ast-module-types "^2.7.1" + node-source-walk "^4.2.0" + typescript "^3.9.10" + detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" @@ -2816,10 +3053,10 @@ detective@^5.2.0: defined "^1.0.0" minimist "^1.1.1" -devtools-protocol@0.0.781568: - version "0.0.781568" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.781568.tgz#4cdca90a952d2c77831096ff6cd32695d8715a04" - integrity sha512-9Uqnzy6m6zEStluH9iyJ3iHyaQziFnMnLeC8vK0eN6smiJmIx7+yB64d67C2lH/LZra+5cGscJAJsNXO+MdPMg== +devtools-protocol@0.0.982423: + version "0.0.982423" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.982423.tgz#39ac3791d4c5b90ebb416d4384663b7b0cc44154" + integrity sha512-FnVW2nDbjGNw1uD/JRC+9U5768W7e1TfUwqbDTcSsAu1jXFjITSX8w3rkW5FEpHRMPPGpvNSmO1pOpqByiWscA== diff@^4.0.1: version "4.0.2" @@ -2835,7 +3072,7 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.0.0, dir-glob@^2.2.2: +dir-glob@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -2849,13 +3086,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -2869,17 +3105,10 @@ domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= - dependencies: - is-obj "^1.0.0" - -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== +dot-prop@^5.1.0, dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" @@ -2898,62 +3127,62 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: dependencies: readable-stream "^2.0.2" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecurve@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" + integrity sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w== + dependencies: + bigi "^1.1.0" + safe-buffer "^5.0.1" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -elliptic@=6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" +electron-to-chromium@^1.4.84: + version "1.4.118" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz#2d917c71712dac9652cc01af46c7d0bd51552974" + integrity sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w== -elliptic@^6.5.2, elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== +elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" + bn.js "^4.11.9" + brorand "^1.1.0" hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" email-addresses@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== -emittery@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" - integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emittery@^0.10.1: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2966,41 +3195,53 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enhanced-resolve@^5.8.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: - ansi-colors "^4.1.1" - -equal-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" - integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= + graceful-fs "^4.2.4" + tapable "^2.2.0" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.18.5, es-abstract@^1.19.1, es-abstract@^1.19.2: + version "1.19.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" + integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -3016,16 +3257,21 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3041,36 +3287,38 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-bitauth@^2.0.0: +escodegen@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-bitauth/-/eslint-config-bitauth-2.0.0.tgz#593f0d3d5abaf3404804943e2e5cf95ca9c8e6e1" - integrity sha512-8/nptEVQjwhj3BdetF8orQYwdmtRi+k7eo3jcchXuQ96sGIq/nn1yp6drgZapn8RDQgluEwzjYclv1pMFd63bA== + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== dependencies: - "@typescript-eslint/eslint-plugin" "3.3.0" - eslint-config-prettier "^6.11.0" + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" -eslint-config-prettier@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" + debug "^3.2.7" + find-up "^2.1.0" eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" @@ -3080,148 +3328,171 @@ eslint-plugin-eslint-comments@^3.2.0: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-functional@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-functional/-/eslint-plugin-functional-3.0.1.tgz#c0b43f6416f91b1debfd7f6bd5be00be1de69121" - integrity sha512-8IhtDsB8b+ungE0hVdd7Xp3u1YtL6SkTbtbpzbNBG8JrjPALKczZdbUazrYOJhVsjJJWgTEQTKM/1+ILzE/SDA== +eslint-plugin-functional@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-functional/-/eslint-plugin-functional-4.2.1.tgz#c486f15695a31f916847c89f0f85a09c8ee423c6" + integrity sha512-j16ozgXrr0UdPBirdbgDZgRBPr9Prj3j1xoisE435wzRDMWQlSHHJ41LCzNrlfGDb7OFAyXVcVatVwALz2jckw== dependencies: - "@typescript-eslint/experimental-utils" "^2.15.0" - array.prototype.flatmap "^1.2.3" - deepmerge "^4.2.2" - escape-string-regexp "^2.0.0" + "@typescript-eslint/utils" "^5.10.2" + deepmerge-ts "^4.0.3" + escape-string-regexp "^4.0.0" -eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" -eslint-plugin-tsdoc@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.6.tgz#8e63aeff24708da5a01ac2bef1e46c4cd779ce09" - integrity sha512-pU6/VVEOlC85BrUjsqZGGSRy41N+PHfWXokqjpQRWT1LSpBsAEbRpsueNYSFS+93Sx9CFD0511kjLKVySRbLbg== +eslint-plugin-tsdoc@^0.2.14: + version "0.2.16" + resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz#a3d31fb9c7955faa3c66a43dd43da7635f1c5e0d" + integrity sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw== dependencies: - "@microsoft/tsdoc" "0.12.20" - "@microsoft/tsdoc-config" "0.13.5" + "@microsoft/tsdoc" "0.14.1" + "@microsoft/tsdoc-config" "0.16.1" -eslint-scope@^5.0.0, eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" - integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== +eslint@8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.15.0.tgz#fea1d55a7062da48d82600d2e0974c55612a11e9" + integrity sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA== dependencies: - "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^1.2.3" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.0" - eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.2.0" - esquery "^1.2.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" + lodash.merge "^4.6.2" + minimatch "^3.1.2" 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" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^5.2.3" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" - integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== dependencies: - acorn "^7.3.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.3.0" + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3232,10 +3503,10 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -events@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" - integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3245,29 +3516,35 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.2.2.tgz#e2ead472c2c31aad6f73f1ac956eef45e12320cb" - integrity sha1-4urUcsLDGq1vc/GslW7vReEjIMs= +execa@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== dependencies: - cross-spawn-async "^2.1.1" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" - strip-eof "^1.0.0" + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" + 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" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" @@ -3276,57 +3553,43 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== +express@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.0" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + 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.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.10.3" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + 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" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -3336,21 +3599,7 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@^2.0.0: +extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -3361,66 +3610,77 @@ extract-zip@^2.0.0: optionalDependencies: "@types/yauzl" "^2.9.1" -fast-check@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.1.0.tgz#5d7b6f104160253361e95ce9c282b749395a5ee9" - integrity sha512-aZe06whLv1ZNFM1rn8mGL3+wf0PQpZyySQ81+O0L3APiLNzCi2PtJqeohn5Xab1yAxF3Vhzf5AvKzPispGd0tQ== +fast-check@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.25.0.tgz#5146601851bf3be0953bd17eb2b7d547936c6561" + integrity sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg== dependencies: - pure-rand "^3.0.0" + pure-rand "^5.0.1" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.2.0: +fast-diff@^1.1.2, fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" +fast-equals@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-3.0.2.tgz#77f80047b381b6cb747130463ccc144e24c44097" + integrity sha512-iY0fAmW7fzxHp22VCRLpOgWbsWsF+DJWi1jhc8w+VGlJUiS+KcGZV2A8t+Q9oTQwhG3L1W8Lu/oe3ZyOPdhZjw== -fast-glob@^3.0.3, fast-glob@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" + +fast-json-patch@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.2.1.tgz#18150d36c9ab65c7209e7d4eb113f4f8eaabe6d9" + integrity sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig== + dependencies: + fast-deep-equal "^2.0.1" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-safe-stringify@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -3438,61 +3698,69 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.1.0, figures@^3.2.0: +figures@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-type@^14.1.4: - version "14.7.1" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-14.7.1.tgz#f748732b3e70478bff530e1cf0ec2fe33608b1bb" - integrity sha512-sXAMgFk67fQLcetXustxfKX+PZgHIUFn96Xld9uH8aXPdX3xOp0/jg9OdouVTvQrf7mrn+wAa4jN/y9fUOOiRA== +figures@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/figures/-/figures-4.0.1.tgz#27b26609907bc888b3e3b0ef5403643f80aa2518" + integrity sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w== dependencies: - readable-web-to-node-stream "^2.0.0" - strtok3 "^6.0.3" - token-types "^2.0.0" - typedarray-to-buffer "^3.1.5" + escape-string-regexp "^5.0.0" + is-unicode-supported "^1.2.0" -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" -filenamify-url@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50" - integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A= +file-type@^16.5.0: + version "16.5.3" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06" + integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== dependencies: - filenamify "^1.0.0" - humanize-url "^1.0.0" + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.2.4" + token-types "^4.1.1" -filenamify@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" trim-repeated "^1.0.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +filing-cabinet@^3.0.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-3.3.0.tgz#365294d2d3d6ab01b4273e62fb6d23388a70cc0f" + integrity sha512-Tnbpbme1ONaHXV5DGcw0OFpcfP3p2itRf5VXO1bguBXdIewDbK6ZFBK//DGKM0BuCzaQLQNY4f5gljzxY1VCUw== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + app-module-path "^2.2.0" + commander "^2.20.3" + debug "^4.3.3" + enhanced-resolve "^5.8.3" + is-relative-path "^1.0.2" + module-definition "^3.3.1" + module-lookup-amd "^7.0.1" + resolve "^1.21.0" + resolve-dependency-path "^2.0.0" + sass-lookup "^3.0.0" + stylus-lookup "^3.0.1" + tsconfig-paths "^3.10.1" + typescript "^3.9.7" fill-range@^7.0.1: version "7.0.1" @@ -3501,49 +3769,41 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" -find-node-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" - integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== dependencies: - findup-sync "^3.0.0" - merge "^1.2.1" + findup-sync "^4.0.0" + merge "^2.1.1" find-root@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -3566,39 +3826,59 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== dependencies: detect-file "^1.0.0" is-glob "^4.0.0" - micromatch "^3.0.4" + micromatch "^4.0.2" resolve-dir "^1.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== fn-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= foreground-child@^2.0.0: version "2.0.0" @@ -3608,17 +3888,10 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" @@ -3626,9 +3899,9 @@ fresh@0.5.2: integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fromentries@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" - integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-access@^1.0.1: version "1.0.1" @@ -3651,15 +3924,14 @@ fs-extra@8.1.0, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: - at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-extra@~7.0.1: version "7.0.1" @@ -3675,10 +3947,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -3695,94 +3967,111 @@ gensequence@^3.1.1: resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-3.1.1.tgz#95c1afc7c0680f92942c17f2d6f83f3d26ea97af" integrity sha512-ys3h0hiteRwmY6BsvSttPmkhC0vEQHPJduANBRtH/dlDPZ0UBIb/dXy80IcckXyuQ6LKg+PloRqvGER9IS7F7g== -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-amd-module-type@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz#46550cee2b8e1fa4c3f2c8a5753c36990aa49ab0" + integrity sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw== + dependencies: + ast-module-types "^3.0.0" + node-source-walk "^4.2.2" get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= +get-pkg-repo@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" through2 "^2.0.0" + yargs "^16.2.0" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stdin@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" -get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" -gh-pages@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.1.0.tgz#ec3ed0f6a6e3fc3d888758fa018f08191c96bd55" - integrity sha512-3b1rly9kuf3/dXsT8+ZxP0UhNLOo1CItj+3e31yUVcaph/yDsJ9RzD7JOw5o5zpBTJVQLlJAASNkUfepi9fe2w== +gh-pages@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-4.0.0.tgz#bd7447bab7eef008f677ac8cc4f6049ab978f4a6" + integrity sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ== dependencies: async "^2.6.1" commander "^2.18.0" email-addresses "^3.0.1" - filenamify-url "^1.0.0" + filenamify "^4.3.0" find-cache-dir "^3.3.1" fs-extra "^8.1.0" globby "^6.1.0" -git-raw-commits@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== +git-raw-commits@^2.0.8: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" git-remote-origin-url@^2.0.0: version "2.0.0" @@ -3792,12 +4081,12 @@ git-remote-origin-url@^2.0.0: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.0.0.tgz#a9dd58a0dd3561a4a9898b7e9731cf441c98fc38" - integrity sha512-LajaAWLYVBff+1NVircURJFL8TQ3EMIcLAfHisWYX/nPoMwnTYfWAznQDmMujlLqoD12VtLmoSrF1sQ5MhimEQ== +git-semver-tags@^4.0.0, git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== dependencies: - meow "^7.0.0" + meow "^8.0.0" semver "^6.0.0" gitconfiglocal@^1.0.0: @@ -3807,25 +4096,19 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" glob@7.1.4: version "7.1.4" @@ -3839,10 +4122,10 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.3, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3851,6 +4134,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -3858,13 +4152,6 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3890,38 +4177,35 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" + integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== +globby@^11.0.1, globby@^11.0.3, globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - "@types/glob" "^7.1.1" array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== +globby@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.1.tgz#7c44a93869b0b7612e38f22ed532bfe37b25ea6f" + integrity sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q== dependencies: - array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" globby@^6.1.0: version "6.1.0" @@ -3946,46 +4230,29 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== +gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + minimist "^1.2.5" + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graphviz@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/graphviz/-/graphviz-0.0.9.tgz#0bbf1df588c6a92259282da35323622528c4bbc4" + integrity sha512-SmoY2pOtcikmMCqCSy2NO1YsRfu9OO0wpTlOYW++giGjfX1a6gax/m1Fo8IdUd0/3H15cTOfR1SMKwohj4LKsg== + dependencies: + temp "~0.4.0" -handlebars@^4.7.6: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" @@ -3999,6 +4266,11 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-bigints@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4009,58 +4281,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= - dependencies: - is-glob "^3.0.0" - has-own-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: +has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" + get-intrinsic "^1.1.1" -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-values@^1.0.0: +has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has-symbols "^1.0.2" has@^1.0.0, has@^1.0.3: version "1.0.3" @@ -4087,19 +4330,14 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.5: minimalistic-assert "^1.0.1" hasha@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" - integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" type-fest "^0.8.0" -highlight.js@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.1.2.tgz#c20db951ba1c22c055010648dfffd7b2a968e00c" - integrity sha512-Q39v/Mn5mfBlMff9r+zzA+gWxRsCRKwEMvYTiisLr/XUiFI/4puWt0Ojdko3R3JCNWGdOWaA5g/Yxqa23kC5AA== - -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -4116,9 +4354,16 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" html-escaper@^2.0.0: version "2.0.2" @@ -4130,32 +4375,16 @@ htmlescape@^1.1.0: resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-proxy-agent@^4.0.0: version "4.0.1" @@ -4171,21 +4400,18 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: - agent-base "5" + agent-base "6" debug "4" -humanize-url@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff" - integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8= - dependencies: - normalize-url "^1.0.0" - strip-url-auth "^1.0.0" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -4194,20 +4420,20 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-by-default@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz#537092018540640459569fe7c8c7a408af581146" integrity sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA== -ignore-walk@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== +ignore-walk@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" @@ -4216,50 +4442,30 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.0.5, ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0, import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0, indent-string@^3.2.0: +indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -4269,6 +4475,16 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4277,7 +4493,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4287,15 +4503,10 @@ inherits@2.0.1, inherits@=2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inline-source-map@~0.6.0: version "0.6.2" @@ -4304,10 +4515,10 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" -inquirer@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== +inquirer@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -4323,10 +4534,10 @@ inquirer@6.5.0: strip-ansi "^5.1.0" through "^2.3.6" -insert-module-globals@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" - integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== +insert-module-globals@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== dependencies: JSONStream "^1.0.3" acorn-node "^1.5.2" @@ -4339,40 +4550,45 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -irregular-plurals@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" - integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" +irregular-plurals@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" + integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: - kind-of "^6.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -4380,92 +4596,60 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.0, is-buffer@^1.1.5: +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.0: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== +is-builtin-module@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" + integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== dependencies: - ci-info "^2.0.0" + builtin-modules "^3.0.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-core-module@^2.1.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: - kind-of "^6.0.0" + has "^1.0.3" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + has-tostringtag "^1.0.0" -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-error@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -4476,27 +4660,24 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.0.0, is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: - is-extglob "^2.1.1" + has-tostringtag "^1.0.0" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" + is-extglob "^2.1.1" is-interactive@^1.0.0: version "1.0.0" @@ -4508,24 +4689,24 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.0: +is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= @@ -4540,63 +4721,81 @@ is-path-cwd@^2.2.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.1, is-path-inside@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + +is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-4.1.1.tgz#1a14d6452cbd50790edc7fdaa0aed5a40a35ebb5" - integrity sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA== +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -is-reference@^1.1.2: +is-reference@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== dependencies: "@types/estree" "*" -is-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has-symbols "^1.0.1" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-relative-path@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-relative-path/-/is-relative-path-1.0.2.tgz#091b46a0d67c1ed0fe85f1f8cfdde006bb251d46" + integrity sha1-CRtGoNZ8HtD+hfH4z93gBrslHUY= + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" @@ -4605,34 +4804,67 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-utf8@^0.2.0, is-utf8@^0.2.1: +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-unicode-supported@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz#f4f54f34d8ebc84a46b93559a036763b6d3e1014" + integrity sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ== + +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -4642,22 +4874,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-hook@^3.0.0: version "3.0.0" @@ -4699,32 +4919,32 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterable-to-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/iterable-to-stream/-/iterable-to-stream-1.0.1.tgz#37e86baacf6b1a0e9233dad4eb526d0423d08bf3" - integrity sha512-O62gD5ADMUGtJoOoM9U6LQ7i4byPXUNoHJ6mqsmkQJcom331ZJGDApWgDESWyBMEHEJRjtHozgIiTzYo9RU4UA== - jju@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -4735,18 +4955,25 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@~3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@3.14.1, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.10.0, js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@~3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4756,40 +4983,38 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-migrate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz#335ef5218cd32fcc96c1ddce66c71ba586224496" + integrity sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ== + dependencies: + ajv "^8.0.0" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json-stable-stringify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" - integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= - dependencies: - jsonify "~0.0.0" - json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4802,12 +5027,15 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" +json5@^2.1.3, json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== jsonfile@^4.0.0: version "4.0.0" @@ -4817,56 +5045,25 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - universalify "^1.0.0" + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: +junk@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.0.tgz#9b1104ddf5281cd24ffa3c8a7443d19ce192b37f" + integrity sha512-ojtSU++zLJ3jQG9bAYjg94w+/DOJtRyD7nPaerMFrBhmdVmiV5/exYH5t4uHga4G/95nT6hr1OJoKIFbYbrW5w== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -4879,13 +5076,6 @@ labeled-stream-splicer@^2.0.0: inherits "^2.0.1" stream-splicer "^2.0.0" -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4894,31 +5084,18 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-json-file@^4.0.0: version "4.0.0" @@ -4930,18 +5107,12 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -load-json-file@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" +load-json-file@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== -loady@~0.0.1: +loady@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/loady/-/loady-0.0.5.tgz#b17adb52d2fb7e743f107b0928ba0b591da5d881" integrity sha512-uxKD2HIj042/HBx77NBcmEPsD+hxCgAtjEWlYNScuUjIsh/62Uyu39GOR68TBR68v+jqDL9zfftCWoUo4y03sQ== @@ -4969,22 +5140,31 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.0.tgz#241d62af60739f6097c055efe10329c88b798425" + integrity sha512-HNx5uOnYeK4SxEoid5qnhRfprlJeGMzFRKPLCf/15N3/B4AiofNwC/yq7VBKdVk9dx7m+PiYCJOGg55JYTAqoQ== + dependencies: + p-locate "^6.0.0" lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.get@^4.0.0: +lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.isequal@^4.0.0: +lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= @@ -5004,37 +5184,23 @@ lodash.memoize@~3.0.3: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash.template@^4.0.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash@4.17.15, lodash@=4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.13.1, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@~4.17.15: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.13.1, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@~4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - chalk "^2.4.2" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" longest@^2.0.1: version "2.0.1" @@ -5049,43 +5215,52 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^4.0.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lunr@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" - integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + yallist "^4.0.0" -magic-string@^0.25.2: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +madge@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/madge/-/madge-5.0.1.tgz#2096d9006558ea0669b3ade89c2cda708a24e22b" + integrity sha512-krmSWL9Hkgub74bOjnjWRoFPAJvPwSG6Dbta06qhWOq6X/n/FPzO3ESZvbFYVIvG2g4UHXvCJN1b+RZLaSs9nA== dependencies: - pify "^4.0.1" - semver "^5.6.0" + chalk "^4.1.1" + commander "^7.2.0" + commondir "^1.0.1" + debug "^4.3.1" + dependency-tree "^8.1.1" + detective-amd "^3.1.0" + detective-cjs "^3.1.1" + detective-es6 "^2.2.0" + detective-less "^1.0.2" + detective-postcss "^5.0.0" + detective-sass "^3.0.1" + detective-scss "^2.0.1" + detective-stylus "^1.0.0" + detective-typescript "^7.0.0" + graphviz "0.0.9" + ora "^5.4.1" + pluralize "^8.0.0" + precinct "^8.1.0" + pretty-ms "^7.0.1" + rc "^1.2.7" + typescript "^3.9.5" + walkdir "^0.4.1" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" @@ -5106,12 +5281,7 @@ map-age-cleaner@^0.1.3: dependencies: p-defer "^1.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= @@ -5121,29 +5291,22 @@ map-obj@^2.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" +map-obj@^4.0.0, map-obj@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -marked@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.0.0.tgz#d35784245a04871e5988a491e28867362e941693" - integrity sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng== +marked@^4.0.12: + version "4.0.14" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.14.tgz#7a3a5fa5c80580bac78c1ed2e3b84d7bd6fc3870" + integrity sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ== -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== dependencies: - escape-string-regexp "^4.0.0" + escape-string-regexp "^5.0.0" md5-hex@^3.0.1: version "3.0.1" @@ -5166,34 +5329,36 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.0.tgz#846eca0bd4708a8f04b9c3f3cd769e194ae63c5c" - integrity sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg== +mem@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== dependencies: map-age-cleaner "^0.1.3" - mimic-fn "^3.0.0" + mimic-fn "^4.0.0" memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= +meow@^10.0.1, meow@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.2.tgz#62951cb69afa69594142c8250806bc30a3912e4d" + integrity sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q== dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + "@types/minimist" "^1.2.2" + camelcase-keys "^7.0.0" + decamelize "^5.0.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.2" + read-pkg-up "^8.0.0" + redent "^4.0.0" + trim-newlines "^4.0.2" + type-fest "^1.2.2" + yargs-parser "^20.2.9" meow@^4.0.0: version "4.0.1" @@ -5210,88 +5375,55 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" -meow@^6.1.0, meow@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -meow@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" - integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" - arrify "^2.0.1" - camelcase "^6.0.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" read-pkg-up "^7.0.1" redent "^3.0.0" trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" + type-fest "^0.18.0" + yargs-parser "^20.2.3" merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.2.3, merge2@^1.3.0: +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.0.5" + braces "^3.0.2" + picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" @@ -5301,28 +5433,23 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.44.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -5333,17 +5460,12 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" - integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -min-indent@^1.0.0: +min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== @@ -5353,27 +5475,26 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.0, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimatch@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" + brace-expansion "^2.0.1" -minimist-options@^4.0.2: +minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== @@ -5382,37 +5503,43 @@ minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.5, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -module-deps@^6.0.0: +module-definition@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.4.0.tgz#953a3861f65df5e43e80487df98bb35b70614c2b" + integrity sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA== + dependencies: + ast-module-types "^3.0.0" + node-source-walk "^4.0.0" + +module-deps@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== @@ -5433,6 +5560,17 @@ module-deps@^6.0.0: through2 "^2.0.0" xtend "^4.0.0" +module-lookup-amd@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz#d67c1a93f2ff8e38b8774b99a638e9a4395774b2" + integrity sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ== + dependencies: + commander "^2.8.1" + debug "^4.1.0" + glob "^7.1.6" + requirejs "^2.3.5" + requirejs-config-file "^4.0.0" + mount-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mount-point/-/mount-point-3.0.0.tgz#665cb9edebe80d110e658db56c31d0aef51a8f97" @@ -5442,66 +5580,47 @@ mount-point@^3.0.0: pify "^2.3.0" pinkie-promise "^2.0.1" -move-file@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/move-file/-/move-file-1.2.0.tgz#789f92d276c62511d214b1b285aa16e015c2f2fc" - integrity sha512-USHrRmxzGowUWAGBbJPdFjHzEqtxDU03pLHY0Rfqgtnq+q8FOIs8wvkkf+Udmg77SJKs47y9sI0jJvQeYsmiCA== +move-file@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/move-file/-/move-file-3.0.0.tgz#b2da5d7b4627e61ff5408841e81312143fa58a64" + integrity sha512-v6u4XjX3MFW6Jo1V/YfbhC7eiGSgvYPJ/NM+aGtTtB9/Y6IYj7YViaHu6dkgDsZFB7MbnAoSI5+Z26XZXnP0vg== dependencies: - cp-file "^6.1.0" - make-dir "^3.0.0" - path-exists "^3.0.0" + path-exists "^5.0.0" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1, ms@^2.1.2: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.0: version "2.6.2" @@ -5509,9 +5628,9 @@ neo-async@^2.6.0: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" + integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== nice-try@^1.0.4: version "1.0.5" @@ -5523,15 +5642,17 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.2.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7, node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" node-gyp-build@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== node-preload@^0.2.1: version "0.2.1" @@ -5540,7 +5661,24 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.5.0: +node-releases@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" + integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== + +node-source-walk@^4.0.0, node-source-walk@^4.2.0, node-source-walk@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.3.0.tgz#8336b56cfed23ac5180fe98f1e3bb6b11fd5317c" + integrity sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA== + dependencies: + "@babel/parser" "^7.0.0" + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -5550,26 +5688,21 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^1.0.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== - npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" @@ -5585,23 +5718,25 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" - integrity sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8= +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - path-key "^1.0.0" + path-key "^3.0.0" null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - nyc@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" @@ -5635,68 +5770,44 @@ nyc@^15.1.0: test-exclude "^6.0.0" yargs "^15.0.2" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + es-abstract "^1.19.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -5714,31 +5825,44 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.1.tgz#5c8016847b0d67fcedb7eef254751cfcdc7e9418" - integrity sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg== +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open-cli@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/open-cli/-/open-cli-6.0.1.tgz#adcee24967dc12c65d8cb8bf994e7dc40aed7a8e" - integrity sha512-A5h8MF3GrT1efn9TiO9LPajDnLtuEiGQT5G8TxWObBlgt1cZJF1YbQo/kNtsD1bJb7HxnT6SaSjzeLq0Rfhygw== +open-cli@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/open-cli/-/open-cli-7.0.1.tgz#2de9d9658a35fb04ba397e7c503f4fe52d6e7373" + integrity sha512-w//Mb5nLGTu9aIAsAehgxV+CGEkd+P3CbdoTW8y2coQ/fmGXBSrea0i4RBqGnd9prSPX1akrBYc0e3NnWM4SPA== dependencies: - file-type "^14.1.4" - get-stdin "^7.0.0" - meow "^6.1.0" - open "^7.0.3" - temp-write "^4.0.0" + file-type "^16.5.0" + get-stdin "^9.0.0" + meow "^10.0.1" + open "^8.2.0" + tempy "^1.0.1" -open@^7.0.3: - version "7.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.1.0.tgz#68865f7d3cb238520fa1225a63cf28bcf8368a1c" - integrity sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA== +open@^8.2.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" optionator@^0.9.1: version "0.9.1" @@ -5752,17 +5876,18 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^4.0.5: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc" - integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: - chalk "^3.0.0" + bl "^4.1.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-spinners "^2.2.0" + cli-spinners "^2.5.0" is-interactive "^1.0.0" - log-symbols "^3.0.0" - mute-stream "0.0.8" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" strip-ansi "^6.0.0" wcwidth "^1.0.1" @@ -5781,18 +5906,6 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -5805,18 +5918,30 @@ p-event@^4.1.0: dependencies: p-timeout "^3.1.0" -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== +p-event@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== + dependencies: + p-timeout "^5.0.2" + +p-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-3.0.0.tgz#ce50e03b24b23930e11679ab8694bd09a2d7ed35" + integrity sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg== dependencies: - p-map "^2.0.0" + p-map "^5.1.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -5831,6 +5956,20 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5852,10 +5991,19 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" p-map@^3.0.0: version "3.0.0" @@ -5871,6 +6019,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^5.1.0, p-map@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.3.0.tgz#2204823bc9f37f17ddc9e7f446293c4530b8a4cf" + integrity sha512-SRbIQFoLYNezHkqZslqeg963HYUtqOrfMCxjNrFOpJ19WTYuq26rQoOXeX8QQiMLUlLqdYV/7PuDsdYJ7hLE1w== + dependencies: + aggregate-error "^4.0.0" + p-timeout@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -5878,12 +6033,17 @@ p-timeout@^3.1.0: dependencies: p-finally "^1.0.0" +p-timeout@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.0.2.tgz#d12964c4b2f988e15f72b455c2c428d82a0ec0a0" + integrity sha512-sEmji9Yaq+Tw+STwsGAE56hf7gMy9p0tQfJojIAamB7WHJYJKf1qlsg9jqBWG8q9VCxKPhZaP/AcXwEoBcYQhQ== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= -p-try@^2.0.0, p-try@^2.2.0: +p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== @@ -5898,16 +6058,6 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -5920,6 +6070,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -5928,29 +6085,16 @@ parents@^1.0.0, parents@^1.0.1: path-platform "~0.11.15" parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -5959,14 +6103,14 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" - integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-ms@^2.1.0: @@ -5984,27 +6128,10 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^3.0.0: version "3.0.0" @@ -6016,30 +6143,30 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - integrity sha1-XVPVeAGWRsDWiADbThRua9wqx68= - path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-platform@~0.11.15: version "0.11.15" @@ -6051,22 +6178,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -6080,9 +6191,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -6090,27 +6201,32 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -peek-readable@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.0.tgz#250b08b7de09db8573d7fd8ea475215bbff14348" - integrity sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA== +peek-readable@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" + integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -6120,11 +6236,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pinkie-promise@^2.0.0, pinkie-promise@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -6137,22 +6248,15 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= +pkg-conf@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== dependencies: - find-up "^2.1.0" + find-up "^6.0.0" + load-json-file "^7.0.0" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@4.2.0, pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -6164,42 +6268,90 @@ platform@^1.3.3: resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== -plur@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" - integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== +plur@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== dependencies: - irregular-plurals "^3.2.0" + irregular-plurals "^3.3.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-values-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-5.0.0.tgz#10c61ac3f488e4de25746b829ea8d8894e9ac3d2" + integrity sha512-2viDDjMMrt21W2izbeiJxl3kFuD/+asgB0CBwPEgSyhCmBnDIa/y+pLaoyX+q3I3DHH0oPPL3cgjVTQvlS1Maw== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + +postcss@^8.1.7, postcss@^8.4.6: + version "8.4.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== + dependencies: + nanoid "^3.3.3" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +precinct@^8.0.0, precinct@^8.1.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-8.3.1.tgz#94b99b623df144eed1ce40e0801c86078466f0dc" + integrity sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q== + dependencies: + commander "^2.20.3" + debug "^4.3.3" + detective-amd "^3.1.0" + detective-cjs "^3.1.1" + detective-es6 "^2.2.1" + detective-less "^1.0.2" + detective-postcss "^4.0.0" + detective-sass "^3.0.1" + detective-scss "^2.0.1" + detective-stylus "^1.0.0" + detective-typescript "^7.0.0" + module-definition "^3.3.1" + node-source-walk "^4.2.0" prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" -prettier@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -pretty-ms@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.0.tgz#45781273110caf35f55cab21a8a9bd403a233dc0" - integrity sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg== +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== dependencies: parse-ms "^2.1.0" @@ -6220,29 +6372,24 @@ process@~0.11.0: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: +progress@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.0.0: +proxy-from-env@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -6278,53 +6425,40 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== - dependencies: - escape-goat "^2.0.0" - -puppeteer@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.2.1.tgz#7f0564f0a5384f352a38c8cc42af875cd87f4ea6" - integrity sha512-PZoZG7u+T6N1GFWBQmGVG162Ak5MAy8nYSVpeeQrwJK2oYUlDWpHEJPcd/zopyuEMTv7DiztS1blgny1txR2qw== - dependencies: - debug "^4.1.0" - devtools-protocol "0.0.781568" - extract-zip "^2.0.0" - https-proxy-agent "^4.0.0" - mime "^2.0.3" - pkg-dir "^4.2.0" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^3.0.2" - tar-fs "^2.0.0" - unbzip2-stream "^1.3.3" - ws "^7.2.3" - -pure-rand@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-3.0.0.tgz#9dd90685e0c6ff98871f656a5e37fe90d2bfe0e4" - integrity sha512-7/U3rk8elhZPagxdheW1UHEhRr0IF8wCs3qyYVVswSxLoRrrrCMyaTKtAYIrCfuTeUoX/O3rN1piY/pX8JEcEA== +puppeteer@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-14.1.0.tgz#319560e20ff451890158d7146c79ab589c6e7031" + integrity sha512-T3eB4f6k9HVttYvyy8drGIKb04M+vxhepqM7qqcVCBTNT3T6M9cUaJT4k7P+a6wSonObJSJUP98JkPDQG+3fJw== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.982423" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + pkg-dir "4.2.0" + 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.6.0" + +pure-rand@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.1.tgz#97a287b4b4960b2a3448c0932bf28f2405cac51d" + integrity sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ== q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + side-channel "^1.0.4" querystring-es3@~0.2.0: version "0.2.1" @@ -6336,6 +6470,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -6346,7 +6485,17 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" + integrity sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -6366,17 +6515,17 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8: +rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6393,22 +6542,6 @@ read-only-stream@^2.0.0: dependencies: readable-stream "^2.0.2" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -6426,23 +6559,14 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= +read-pkg-up@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" + integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" + find-up "^5.0.0" + read-pkg "^6.0.0" + type-fest "^1.0.1" read-pkg@^3.0.0: version "3.0.0" @@ -6463,7 +6587,17 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +read-pkg@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" + integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^3.0.2" + parse-json "^5.2.0" + type-fest "^1.0.1" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -6485,32 +6619,19 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-web-to-node-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-2.0.0.tgz#751e632f466552ac0d5c440cc01470352f93c4b7" - integrity sha512-+oZJurc4hXpaaqsN68GoZGQAQIA3qr09Or4fqEsargABnbe5Aau8hFn6ISVleT3cpY/0n/8drn7huyyEvTbghA== - -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= +readable-web-to-node-stream@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== dependencies: - resolve "^1.1.6" + readable-stream "^3.6.0" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + picomatch "^2.2.1" redent@^2.0.0: version "2.0.0" @@ -6528,32 +6649,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== +redent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" + integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== dependencies: - rc "^1.2.8" + indent-string "^5.0.0" + strip-indent "^4.0.0" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== release-zalgo@^1.0.0: version "1.0.0" @@ -6562,33 +6669,39 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requirejs-config-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc" + integrity sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw== + dependencies: + esprima "^4.0.0" + stringify-object "^3.2.1" + +requirejs@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" + integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -6596,6 +6709,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-dependency-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz#11700e340717b865d216c66cabeb4a2a3c696736" + integrity sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w== + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -6621,37 +6739,30 @@ resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@^1.1.4, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.21.0, resolve@^1.22.0, resolve@^1.4.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@~1.17.0: +resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@~1.12.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.3.tgz#96d5253df8005ce19795c14338f2a013c38a8c15" - integrity sha512-hF6+hAPlxjqHWrw4p1rF3Wztbgxd4AjA5VlUzY5zcTb4J8D3JK4/1RjU48pHz2PJWzGVsLB1VWZkvJzhK2CCOA== +resolve@~1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== dependencies: + is-core-module "^2.1.0" path-parse "^1.0.6" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -6668,24 +6779,12 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6700,12 +6799,12 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup@^2.23.1: - version "2.23.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.23.1.tgz#d458d28386dc7660c2e8a4978bea6f9494046c20" - integrity sha512-Heyl885+lyN/giQwxA8AYT2GY3U+gOlTqVLrMQYno8Z1X9lAOpfXPiKiZCyPc25e9BLJM3Zlh957dpTlO4pa8A== +rollup@^2.73.0: + version "2.73.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.73.0.tgz#128fef4b333fd92d02d6929afbb6ee38d7feb32d" + integrity sha512-h/UngC3S4Zt28mB3g0+2YCMegT5yoftnQplwzPqGZcKvlld5e+kT/QRmJiL+qxGyZKOYpgirWGdLyEO1b0dpLQ== optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" run-async@^2.2.0: version "2.4.1" @@ -6713,125 +6812,119 @@ run-async@^2.2.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" rxjs@^6.4.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-stable-stringify@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" + integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -secp256k1@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== +sass-lookup@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-3.0.0.tgz#3b395fa40569738ce857bc258e04df2617c48cac" + integrity sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg== dependencies: - elliptic "^6.5.2" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" + commander "^2.16.0" -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== +secp256k1@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - semver "^6.3.0" + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@~7.3.0: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@~7.3.0: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + 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 "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.18.0" set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: +sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -6846,14 +6939,6 @@ shasum-object@^1.0.0: dependencies: fast-safe-stringify "^2.0.7" -shasum@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" - integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= - dependencies: - json-stable-stringify "~0.0.0" - sha.js "~2.4.4" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -6879,23 +6964,32 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shelljs@^0.8.3, shelljs@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== +shiki@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-concat@^1.0.0: version "1.0.1" @@ -6907,96 +7001,38 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: - is-plain-obj "^1.0.0" + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@^0.5.17, source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: +source-map@^0.5.0, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -7006,7 +7042,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -7045,23 +7081,16 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: - through2 "^2.0.2" + readable-stream "^3.0.0" split@^1.0.0: version "1.0.1" @@ -7080,54 +7109,46 @@ stack-utils@^0.4.0: resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-0.4.0.tgz#940cb82fccfa84e8ff2f3fdf293fe78016beccd1" integrity sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE= -stack-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" - integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== +stack-utils@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" -standard-version@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-8.0.2.tgz#02ed7131f83046bd04358dc54f97d42c4b2fd828" - integrity sha512-L8X9KFq2SmVmaeZgUmWHFJMOsEWpjgFAwqic6yIIoveM1kdw1vH4Io03WWxUDjypjGqGU6qUtcJoR8UvOv5w3g== +standard-version@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-9.3.2.tgz#28db8c1be66fd2d736f28f7c5de7619e64cd6dab" + integrity sha512-u1rfKP4o4ew7Yjbfycv80aNMN2feTiqseAhUhrrx2XtdQGmu7gucpziXe68Z4YfHVqlxVEzo4aUA0Iu3VQOTgQ== dependencies: chalk "^2.4.2" - conventional-changelog "3.1.21" + conventional-changelog "3.1.24" conventional-changelog-config-spec "2.1.0" - conventional-changelog-conventionalcommits "4.3.0" - conventional-recommended-bump "6.0.9" + conventional-changelog-conventionalcommits "4.6.1" + conventional-recommended-bump "6.1.0" detect-indent "^6.0.0" detect-newline "^3.1.0" dotgitignore "^2.1.0" figures "^3.1.0" - find-up "^4.1.0" + find-up "^5.0.0" fs-access "^1.0.1" git-semver-tags "^4.0.0" semver "^7.1.1" stringify-package "^1.0.1" - yargs "^15.3.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" + yargs "^16.0.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stream-browserify@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + inherits "~2.0.4" + readable-stream "^3.5.0" stream-combiner2@^1.1.1: version "1.1.1" @@ -7145,9 +7166,9 @@ stream-events@^1.0.5: stubs "^3.0.0" stream-http@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" - integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.4" @@ -7162,10 +7183,10 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-argv@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-width@^2.1.0: version "2.1.1" @@ -7175,47 +7196,48 @@ string-width@^2.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.padend@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" - integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.19.1" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@^1.1.1: version "1.3.0" @@ -7231,6 +7253,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-object@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + stringify-package@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" @@ -7250,41 +7281,34 @@ strip-ansi@^5.1.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^6.0.1" strip-bom@4.0.0, strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-indent@^2.0.0: version "2.0.0" @@ -7298,12 +7322,19 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" +strip-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" + strip-json-comments@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@^3.1.0: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -7313,32 +7344,34 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-outer@^1.0.0: +strip-outer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== dependencies: escape-string-regexp "^1.0.2" -strip-url-auth@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae" - integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164= - -strtok3@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.4.tgz#ede0d20fde5aa9fda56417c3558eaafccc724694" - integrity sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ== +strtok3@^6.2.4: + version "6.3.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" + integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== dependencies: - "@tokenizer/token" "^0.1.1" - "@types/debug" "^4.1.5" - peek-readable "^3.1.0" + "@tokenizer/token" "^0.3.0" + peek-readable "^4.1.0" stubs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= +stylus-lookup@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-3.0.2.tgz#c9eca3ff799691020f30b382260a67355fefdddd" + integrity sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg== + dependencies: + commander "^2.8.1" + debug "^4.1.0" + subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" @@ -7346,16 +7379,15 @@ subarg@^1.0.0: dependencies: minimist "^1.1.0" -supertap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-1.0.0.tgz#bd9751c7fafd68c68cf8222a29892206a119fa9e" - integrity sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== +supertap@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== dependencies: - arrify "^1.0.1" - indent-string "^3.2.0" - js-yaml "^3.10.0" - serialize-error "^2.1.0" - strip-ansi "^4.0.0" + indent-string "^5.0.0" + js-yaml "^3.14.1" + serialize-error "^7.0.1" + strip-ansi "^7.0.1" supports-color@^5.3.0: version "5.5.0" @@ -7365,12 +7397,17 @@ supports-color@^5.3.0: has-flag "^3.0.0" supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -7378,73 +7415,63 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" - integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" - tar-stream "^2.0.0" + tar-stream "^2.1.4" -tar-stream@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.3.tgz#1e2022559221b7866161660f118255e20fa79e41" - integrity sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA== +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: - bl "^4.0.1" + bl "^4.0.3" end-of-stream "^1.4.1" fs-constants "^1.0.0" inherits "^2.0.3" readable-stream "^3.1.1" -teeny-request@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-6.0.1.tgz#9b1f512cef152945827ba7e34f62523a4ce2c5b0" - integrity sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g== +teeny-request@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.1.1.tgz#2b0d156f4a8ad81de44303302ba8d7f1f05e20e6" + integrity sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== dependencies: http-proxy-agent "^4.0.0" - https-proxy-agent "^4.0.0" - node-fetch "^2.2.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" stream-events "^1.0.5" - uuid "^3.3.2" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + uuid "^8.0.0" temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -temp-write@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== +temp@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.4.0.tgz#671ad63d57be0fe9d7294664b3fc400636678a60" + integrity sha1-ZxrWPVe+D+nXKUZks/xABjZnimA= + +tempy@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.1.tgz#30fe901fd869cfb36ee2bd999805aa72fbb035de" + integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== dependencies: - graceful-fs "^4.1.15" + del "^6.0.0" is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" test-exclude@^6.0.0: version "6.0.0" @@ -7465,7 +7492,7 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -7473,13 +7500,12 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" + readable-stream "3" through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: version "2.3.8" @@ -7515,26 +7541,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -7542,56 +7548,45 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -token-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.0.0.tgz#b23618af744818299c6fbf125e0fdad98bab7e85" - integrity sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw== +token-types@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.0.tgz#b66bc3d67420c6873222a424eee64a744f4c2f13" + integrity sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w== dependencies: - "@tokenizer/token" "^0.1.0" - ieee754 "^1.1.13" + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" -trash-cli@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/trash-cli/-/trash-cli-3.1.0.tgz#d250d2f7438b50e696302bb9a4ddcf91db7a6f7e" - integrity sha512-R/cUm3Y8NZ607OaMrfbet0S0O6bNsZXOyTvl+pocA+7bnN5mjKVKUN+cdMpZNGR54EVoQv5OCxibuxEgDtNuXQ== +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trash-cli@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/trash-cli/-/trash-cli-5.0.0.tgz#144e6405b54212641c811f877e647ec0eed27c26" + integrity sha512-HdSljBzHHk4HlD3uqvDGBRPB9ta7R8fwPSRSVOTk9qkOqeBT1nO4WCtj2t62rWsU1yg2WGCFNo8UBmlRXgkigA== dependencies: - meow "^3.7.0" - trash "^6.0.0" + meow "^10.1.2" + trash "^8.0.0" -trash@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/trash/-/trash-6.1.1.tgz#8fb863421b31f32571f2650b53534934d5e63025" - integrity sha512-4i56lCmz2RG6WZN018hf4L75L5HboaFuKkHx3wDG/ihevI99e0OgFyl8w6G4ioqBm62V4EJqCy5xw3vQSNXU8A== +trash@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/trash/-/trash-8.1.0.tgz#6ad450a76953a8e47f29b737de309086cfdf34e1" + integrity sha512-gp+zp7IDcyeLCPzsSqF/zmEykOVaga9lsdxzCmlS/bgbjdA1/SdFRYmHI2KCXrqg01Wmyl8fO6tgcb4kDijZSA== dependencies: - "@stroncium/procfs" "^1.0.0" + "@sindresorhus/chunkify" "^0.2.0" + "@stroncium/procfs" "^1.2.1" globby "^7.1.1" - is-path-inside "^3.0.2" - make-dir "^3.0.0" - move-file "^1.1.0" - p-map "^3.0.0" - p-try "^2.2.0" - uuid "^3.3.2" - xdg-trashdir "^2.1.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + is-path-inside "^4.0.0" + move-file "^3.0.0" + p-map "^5.1.0" + uuid "^8.3.2" + xdg-trashdir "^3.1.0" trim-newlines@^2.0.0: version "2.0.0" @@ -7599,14 +7594,14 @@ trim-newlines@^2.0.0: integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -trim-off-newlines@^1.0.0, trim-off-newlines@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +trim-newlines@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c" + integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew== trim-repeated@^1.0.0: version "1.0.0" @@ -7615,47 +7610,56 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" -ts-json-schema-generator@^0.70.2: - version "0.70.2" - resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-0.70.2.tgz#71c9cecf982c402c95ca9f982177ae3eedcaad8e" - integrity sha512-4miuxRyxYvwzCGGzxGvN39fwlY7HDlj1KRpZq8Hi3IegeAnguc9q4gDvcqMaDKoRiNNnV5fwplRWZFhRrtvr4Q== - dependencies: - "@types/json-schema" "^7.0.5" - commander "~5.1.0" - glob "~7.1.6" - json-stable-stringify "^1.0.1" - typescript "~3.9.5" - -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: +ts-json-schema-generator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-1.0.0.tgz#33e4affd1665268899eb57afbad397bc6a58cc53" + integrity sha512-F5VofsyMhNSXKII32NDS8/Ur8o2K3Sh5i/U2ke3UgCKf26ybgm2cZeT2x7VJPl1trML/9QLzz/82l0mvzmb3Vw== + dependencies: + "@types/json-schema" "^7.0.9" + commander "^9.0.0" + glob "^7.2.0" + json5 "^2.2.0" + safe-stable-stringify "^2.3.1" + typescript "~4.6.2" + +ts-node@^10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + 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" - source-map-support "^0.5.17" + v8-compile-cache-lib "^3.0.0" yn "3.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.10.1, tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.8.1, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -7671,15 +7675,32 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.6.0: version "0.6.0" @@ -7691,7 +7712,12 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: +type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -7711,45 +7737,53 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typedoc-default-themes@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.10.2.tgz#743380a80afe62c5ef92ca1bd4abe2ac596be4d2" - integrity sha512-zo09yRj+xwLFE3hyhJeVHWRSPuKEIAsFK5r2u47KL/HBKqpwdUSanoaz5L34IKiSATFrjG5ywmIu98hPVMfxZg== +typedoc@^0.22.13: + version "0.22.15" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.15.tgz#c6ad7ed9d017dc2c3a06c9189cb392bd8e2d8c3f" + integrity sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q== dependencies: - lunr "^2.3.8" + glob "^7.2.0" + lunr "^2.3.9" + marked "^4.0.12" + minimatch "^5.0.1" + shiki "^0.10.1" -typedoc@^0.17.8: - version "0.17.8" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.17.8.tgz#96b67e9454aa7853bfc4dc9a55c8a07adfd5478e" - integrity sha512-/OyrHCJ8jtzu+QZ+771YaxQ9s4g5Z3XsQE3Ma7q+BL392xxBn4UMvvCdVnqKC2T/dz03/VXSLVKOP3lHmDdc/w== - dependencies: - fs-extra "^8.1.0" - handlebars "^4.7.6" - highlight.js "^10.0.0" - lodash "^4.17.15" - lunr "^2.3.8" - marked "1.0.0" - minimatch "^3.0.0" - progress "^2.0.3" - shelljs "^0.8.4" - typedoc-default-themes "^0.10.2" - -typescript@^3.9.7, typescript@~3.9.5: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@^3.9.10, typescript@^3.9.5, typescript@^3.9.7: + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +typescript@^4.4.3, typescript@~4.6.2, typescript@~4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + +typescript@^4.6.4: + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== uglify-js@^3.1.4: - version "3.10.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.1.tgz#dd14767eb7150de97f2573a5ff210db14fffe4ad" - integrity sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q== + version "3.15.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.4.tgz#fa95c257e88f85614915b906204b9623d4fa340d" + integrity sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA== umd@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== -unbzip2-stream@^1.3.3: +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unbzip2-stream@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -7768,15 +7802,10 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -union-value@^1.0.0: +uniq@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= unique-string@^2.0.0: version "2.0.0" @@ -7790,10 +7819,10 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -7805,52 +7834,13 @@ unquote@^1.1.0: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-notifier@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -7859,15 +7849,12 @@ url@~0.11.0: punycode "1.3.2" querystring "0.2.0" -urlgrey@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" - integrity sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +urlgrey@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-1.0.0.tgz#72d2f904482d0b602e3c7fa599343d699bbe1017" + integrity sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w== + dependencies: + fast-url-parser "^1.1.3" user-home@^2.0.0: version "2.0.0" @@ -7888,27 +7875,42 @@ util@0.10.3: dependencies: inherits "2.0.1" -util@~0.10.1: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== +util@~0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== dependencies: - inherits "2.0.3" + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.3.3: +uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.0.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -7918,10 +7920,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validator@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9" - integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA== +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== vary@~1.1.2: version "1.1.2" @@ -7933,10 +7935,30 @@ vm-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vscode-uri@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" - integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== +vscode-languageserver-textdocument@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157" + integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ== + +vscode-oniguruma@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" + integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== + +walkdir@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" + integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== wcwidth@^1.0.1: version "1.0.1" @@ -7945,17 +7967,53 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + well-known-symbols@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.14, which@^1.2.8, which@^1.2.9: +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + +which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -7969,14 +8027,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -word-wrap@^1.0.3, word-wrap@^1.2.3: +word-wrap@^1.0.3, word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -7995,12 +8046,21 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: +write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -8010,40 +8070,33 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== dependencies: - mkdirp "^0.5.1" - -ws@^7.2.3: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + imurmurhash "^0.1.4" + signal-exit "^3.0.7" -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I= - dependencies: - os-homedir "^1.0.0" +ws@8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xdg-trashdir@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-2.1.1.tgz#59a60aaf8e6f9240c1daed9a0944b2f514c27d8e" - integrity sha512-KcVhPaOu2ZurYNHSRTf1+ZHORkTZGCQ+u0JHN17QixRISJq4pXOnjt/lQcehvtHL5QAKhSzKgyjrcNnPdkPBHA== +xdg-trashdir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz#7294262d5793eb5488c2f529fba883ec32a24ea0" + integrity sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ== dependencies: - "@sindresorhus/df" "^2.1.0" + "@sindresorhus/df" "^3.1.1" mount-point "^3.0.0" - pify "^2.2.0" user-home "^2.0.0" - xdg-basedir "^2.0.0" + xdg-basedir "^4.0.0" xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" @@ -8051,21 +8104,26 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^18.1.2, yargs-parser@^18.1.3: +yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -8073,7 +8131,17 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: +yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs@^15.0.2: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -8090,6 +8158,32 @@ yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" + integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -8103,13 +8197,23 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -z-schema@~3.18.3: - version "3.18.4" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2" - integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +z-schema@~5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.3.tgz#68fafb9b735fc7f3c89eabb3e5a6353b4d7b4935" + integrity sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw== dependencies: - lodash.get "^4.0.0" - lodash.isequal "^4.0.0" - validator "^8.0.0" + lodash.get "^4.4.2" + lodash.isequal "^4.5.0" + validator "^13.7.0" optionalDependencies: - commander "^2.7.1" + commander "^2.20.3"